4

有没有人有代码来遍历 TinyXML 中子树的节点?IE:给定一个父母,遍历它的所有孩子和所有孩子的孩子?

4

2 回答 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 );
于 2010-12-07T15:28:33.807 回答
2

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

于 2010-10-11T09:04:39.653 回答