Я хочу поделиться этой странной, но интересной ситуацией, с которой я недавно столкнулся при попытке использовать RapidXML для синтаксического анализа XML в C ++.
Я хотел написать рекурсивную функцию для поиска и возврата определенного узла среди детей.данного узла.Моя первая попытка была:
xml_node<>* get_child(xml_node<> *inputNode, string sNodeFilter)
{
// cycles every child
for (xml_node<> *nodeChild = inputNode->first_node(); nodeChild; nodeChild = nodeChild->next_sibling())
{
if (nodeChild->name() == sNodeFilter)
{
cout << "node name " << nodeChild->name() << "\n";
cout << "nodeChild " << nodeChild << endl;
// returns the desired child
return nodeChild;
}
get_child(nodeChild, sNodeFilter);
}
}
Это работало корректно только с первыми дочерними элементами, но если вы ищете узел, который вложен глубже в ваш XML-файл, узел найден (я вижу, что cout) но после оператора return цикл for, кажется, запускается еще один (или несколько) раз (возможно, из-за стека вызовов рекурсии), затем завершается, и указатель теряется.
Поэтому я попытался исправитьэто с временной переменной, таким образом:
xml_node<>* get_child(xml_node<> *inputNode, string sNodeFilter)
{
xml_node<> *outputNode;
// cycles every child
for (xml_node<> *nodeChild = inputNode->first_node(); nodeChild; nodeChild = nodeChild->next_sibling())
{
if (nodeChild->name() == sNodeFilter)
{
cout << "node name " << nodeChild->name() << "\n";
cout << "nodeChild " << nodeChild << endl;
outputNode = nodeChild;
cout << "outputNode " << outputNode << endl;
// returns the desired child
return outputNode;
}
get_child(nodeChild, sNodeFilter);
}
}
Но ничего не изменилось ..
К сожалению, узлы в RapidXML являются указателями классов, поэтому в этой ситуации побочный эффект мешает мне вывести правильный результат.
Кто-нибудь нашел эту ситуацию или решил эту проблему по-другому?