4

TinyXML のサブツリーのノードを反復処理するコードを持っている人はいますか? IE: 親を指定して、そのすべての子とそのすべての子の子を反復処理しますか?

4

2 に答える 2

4

ベジモスの答えは、私にはかなり良さそうです。

これは 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 );
于 2010-12-07T15:28:33.807 に答える
2

ライブラリで Visitor パターンの実装を使用できます。TiXmlVistor から継承したクラスを作成し、VisitElement などの必要なメソッドをオーバーライドしてから、特定のノードに対して Accept() メソッドを呼び出します。

于 2010-10-11T09:04:39.653 に答える