【问题标题】:TinyXML Iterating over a SubtreeTinyXML 迭代子树
【发布时间】:2010-04-06 04:35:57
【问题描述】:

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

【问题讨论】:

    标签: tinyxml subtree tinyxml++


    【解决方案1】:

    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 );
    

    【讨论】:

    • TiXmlPrinter 代码应该是一个很好的起点。在每个节点上你有什么特别想做的吗?
    • 好的,编辑我的答案以指定我和(我假设)Begemoth 的意思。 HTH。
    【解决方案2】:

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

    【讨论】:

    • 不是我想要的
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2017-06-10
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多