TinyXML のサブツリーのノードを反復処理するコードを持っている人はいますか? IE: 親を指定して、そのすべての子とそのすべての子の子を反復処理しますか?
2 に答える
ベジモスの答えは、私にはかなり良さそうです。
これは TiXmlElement の Accept() メソッドの簡略化されたバージョンで、ビジターを使用せず、代わりに TiXmlNode* をパラメーターとして受け取ります。
void TiXmlIterator::iterate(const TiXmlNode* el)
{
cout << "Iterating Node " << el->Value() << endl;
// More useful code here...
for (const TiXmlNode* node=el->FirstChild(); node; node=node->NextSibling())
{
iterate(node);
}
// And/Or here.
}
ただし、Accept() メソッドは TiXmlVisitor をパラメーターとして受け取り、すべての反復処理を行います。また、ドキュメント全体で呼び出す必要はなく、トラバースするサブツリーのルート ノードだけを呼び出す必要があります。このようにして、適切なメソッドをオーバーライドすることで、TiXmlNode のサブクラスの特定の動作を定義できます。TinyXml のソース コード内の TiXmlPrinter の実装を見て、それがどのように行われるかの良い例を見てください。
それをしたくない場合は、別の例を次に示します。
bool MyTiXmlVisitor::Visit(const TiXmlText& text)
{
cout << "Visiting Text: " << text.Value() << endl;
return true; // This will ensure it keeps iterating
}
これは、Accept() を呼び出したノードのサブツリー内のすべてのテキスト要素に作用します。すべての要素を操作するには、TiXmlVisitor の残りの仮想メソッドをオーバーライドします。次に、サブツリーを反復処理するコードで、次の操作を行います。
subtree_root_node->Accept( my_tixmlvisitor_object );
ライブラリで Visitor パターンの実装を使用できます。TiXmlVistor から継承したクラスを作成し、VisitElement などの必要なメソッドをオーバーライドしてから、特定のノードに対して Accept() メソッドを呼び出します。