TinyXML迭代子树

时间:2010-04-06 04:35:58

标签: tinyxml subtree tinyxml++

有没有人有代码在TinyXML中迭代子树的节点? IE:给定一个父母,遍历其所有孩子及其所有孩子的孩子?

2 个答案:

答案 0 :(得分:4)

Begemoth的回答对我来说听起来不错。

以下是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's source code中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 );

答案 1 :(得分:2)

您可以在库中使用访客模式实施。创建一个继承自TiXmlVistor的类,覆盖必要的方法(如VisitElement),然后为特定节点调用Accept()方法。