Я пытаюсь проанализировать 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, если не найден.
Есть идеи, почему это происходит или что я делаю не так?
Спасибо
Вы запутались между «узлами элемента» XML (то есть root, a, b и т. Д.) И «узлами синтаксического анализатора» RapidXML, созданными анализатором, который включает в себя узлы данных.
Вы можете посмотреть на узел type()
чтобы определить, является ли это узлом данных, или использовать parse_no_data_nodes
разбор флага.
Из документации 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
}