C ++でのXML解析にRapidXMLを使用しようとしたときに、最近遭遇したこの奇妙で興味深い状況を共有したいと思います。
特定のノードの子の中から特定のノードを検索して返す再帰関数を作成したかったのです。私の最初の試みは:
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サイクルが1つ実行されているようです(またはいくつか)より多くの時間(おそらく再帰の呼び出しスタックのため)、それから終了し、ポインタが失われます。
だから私は一時変数でそれを修正しようとしました、このように:
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のノードはクラスポインタであるため、この状況では、副作用により正しい結果を引き出すことができません。
誰かがこの状況を発見したか、または別の方法でこの問題を解決しましたか?