TinyXML:遍历子树

4
有没有遍历TinyXML子树节点的代码?比如:给定一个父节点,遍历所有它的子节点以及其所有子节点的子节点?
2个回答

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源代码中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 );

TiXmlPrinter代码应该是一个很好的起点。你有特别想在每个节点上做的事情吗? - brak3000
好的,我编辑了我的答案以阐明我和(我想)Begemoth 的意思。希望对你有所帮助。 - brak3000

2

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


不太是我所询问的。 - Raindog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接