rapidxml first_node не возвращает ноль

Я пытаюсь проанализировать XML-файл, используя RapidXML в C ++, файл выглядит так:

<root>
<a>
<b>1111</b>
<c>
<d1>2222</d1>
<d2>3333</d2>
</c>
</a>
</root>

Чтобы определить родительские узлы, я делаю:

if (currentNode->first_node() != 0) { // this node has children, search for them }

Он отлично работает для двух первых узлов (root и a), но когда я делаю это для узла ‘b’, он возвращает указатель куда-то вместо 0, но у ‘b’ нет дочерних узлов. Разве это не должно возвращать 0? Документация RapidXML гласит:

функция xml_node :: first_node
конспект

xml_node<Ch>* first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;

Описание
Получает первый дочерний узел, необязательно совпадая с именем узла.

параметры
название

Имя ребенка, чтобы найти, или 0, чтобы вернуть первых детей, независимо от его имени; эта строка не должна заканчиваться нулем, если name_size не равен нулю

name_size
Размер имени, в символах, или 0, чтобы размер вычислялся автоматически из строки

с учетом регистра
Должно ли сравнение имен быть чувствительным к регистру; не чувствительное к регистру сравнение работает корректно только для символов ASCII

Возвращает
Указатель на найденного ребенка или 0, если не найден.

Есть идеи, почему это происходит или что я делаю не так?

Спасибо

1

Решение

Вы запутались между «узлами элемента» XML (то есть root, a, b и т. Д.) И «узлами синтаксического анализатора» RapidXML, созданными анализатором, который включает в себя узлы данных.

Вы можете посмотреть на узел type() чтобы определить, является ли это узлом данных, или использовать parse_no_data_nodes разбор флага.

1

Другие решения

Из документации Rapidxml

   enum node_type
...
Values

node_document     A document node. Name and value are empty.
node_element      An element node. Name contains element name.
Value contains text of first data node.
node_data         A data node. Name is empty. Value contains data text.
node_cdata        A CDATA node. Name is empty. Value contains data text.
node_comment      A comment node. Name is empty. Value contains comment text.
node_declaration  A declaration node. Name and value are empty. Declaration
parameters (version, encoding and standalone) are
in node attributes.
node_doctype      A DOCTYPE node. Name is empty. Value contains DOCTYPE text.
node_pi           A PI node. Name contains target. Value contains instructions.

поэтому, как указал Родди, вы должны проверить тип узла «rapidXML». В вашем примере делать что-то вроде

    if (currentNode->first_node() != 0 && currentNode->type () == node_element)
{
// this node has children, search for them
}
0

По вопросам рекламы [email protected]