Я пытаюсь выполнить простой синтаксический анализ xml, используя Boost Ptrees в C++. Однако похоже, что функция read_xml выдает ошибку только в том случае, если конечный тег отсутствует. Ниже выдается ошибка.
Например:
<?xml version = "1.0" encoding = "utf-8"?>
<Grandparent>
<Parent>test<Parent>
</Grandparent>
Обратите внимание, что конечный тег Parent не имеет закрывающей косой черты, и это выдается как ошибка. Даже отсутствие закрывающего тега, такого как <Parent>test, вызывает ожидаемую допустимую ошибку.
Однако, если строка закрывающего тега не совпадает со строкой открывающего тега, ошибка не возникает. Например:
<?xml version = "1.0" encoding = "utf-8"?>
<Grandparent>
<Parent>test</Child>
</Grandparent>
Приведенный выше синтаксический анализ просто прекрасен. Мой код очень прост, как показано ниже:
using boost::property_tree::ptree;
ptree pt;
read_xml(xmlpath, pt);
Есть ли здесь что-то, что я не замечаю?





Да.
Самое главное: дерево свойств Boost - это не библиотека XML.
Во-вторых, реализация Rapidxml, используемая под капотом, имеет проверку закрывающего тега в качестве опции:
if (Flags & parse_validate_closing_tags)
{
// Skip and validate closing tag name
Ch *closing_name = text;
skip<node_name_pred, Flags>(text);
if (!internal::compare(node->name(), node->name_size(), closing_name, text - closing_name, true))
BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR("invalid closing tag name", text);
}
К счастью, свойство Boost Property не включилось. Фактически, он не выбирает позвольте вам:
/// Text elements should be put in separate keys,
/// not concatenated in parent data.
static const int no_concat_text = 0x1;
/// Comments should be omitted.
static const int no_comments = 0x2;
/// Whitespace should be collapsed and trimmed.
static const int trim_whitespace = 0x4;
inline bool validate_flags(int flags)
{
return (flags & ~(no_concat_text | no_comments | trim_whitespace)) == 0;
}
Никакие другие флаги не допускаются.
Я предлагаю вам обратиться к библиотеке XML, если вам нужен синтаксический анализ XML.
Я обычно предпочитаю PugiXML. См. Также stackoverflow.com/questions/9387610/…
Мне было интересно, есть ли парсер SAX xml, который вы могли бы предложить, который работает как для Windows, так и для Linux? Было довольно сложно запустить libxml2 в Windows. Возникновение всевозможных ошибок при компоновке библиотек.