【问题标题】:TinyXML2 get text from node and all subnodesTinyXML2 从节点和所有子节点获取文本
【发布时间】:2017-04-11 18:22:30
【问题描述】:

如何从 TinyXML2 中的节点和子节点获取文本?

XMLPrinter 类似乎可以满足我的需要,但它不能正确打印文本。

我的 XML:

<div>The quick brown <b>fox</b> jumps over the <i>lazy</i> dog.</div>

我的类扩展了 XMLPrinter 类:

class XMLTextPrinter : public XMLPrinter {
    virtual bool    VisitEnter (const XMLDocument &) { return true; }
    virtual bool    VisitExit (const XMLDocument &)  { return true; }
    virtual bool    VisitEnter (const XMLElement &e, const XMLAttribute *)  {
        auto text = e.GetText();
        if(text) {
            std::cout << text;
        }
        return true;
    }
    virtual bool    VisitExit (const XMLElement &e)  { return true; }
    virtual bool    Visit (const XMLDeclaration &)  { return true; }
    virtual bool    Visit (const XMLText &e) { return true; }
    virtual bool    Visit (const XMLComment &)  { return true; }
    virtual bool    Visit (const XMLUnknown &)  { return true; }
};

我的代码:

XMLDocument document;
document.Parse(..., ...);

auto elem = ...;

XMLTextPrinter printer;
elem->Accept(&printer);

输出:

The quick brown foxlazy

为什么它会忽略 &lt;b&gt;&lt;i&gt; 元素之后的所有文本?我该如何解决这个问题?此外,XMLPrinter 类正确地将其打印出 with 标签,但我不想要标签。

【问题讨论】:

    标签: c++ tinyxml2


    【解决方案1】:

    [2017 年 4 月 14 日编辑以改进(我希望)。]

    XMLPrinter 派生自 XMLVisitor 并打印完整的 XML 文档(或元素)、标签、属性和所有内容。 XMLVisitor 负责在 XML 层次结构中上下递归,调用默认值,什么都不做,方法的实现 VisitEnter/VisitExit 用于可以有后代(子)的节点,即文档和元素以及“访问”对于叶节点,即文本、cmets 等。在派生类中覆盖这些方法以实现所需的功能。

    第一个问题是你正在修改XMLPrinter。这派生自 XMLVisitor 并创建 XML 文档的可打印表示。但随后您将所有 XMLPrintervisit... 方法替换为您自己的方法。直接从XMLVisitor 派生会更好,而且工作量更少。

    其次,您使用GetText() 单独从VisitEnter 获取元素文本,当子节点嵌入其中as documented here 时,这将不起作用。

    在这种情况下,要仅获取所有元素的文本,覆盖文本叶节点的Visit,即Visit(const XMLText &amp;)

    #include "tinyxml2.h"
    #include <iostream>
    
    using namespace tinyxml2;
    
    class XMLPrintText : public XMLVisitor
    {
    public:
       virtual bool Visit (const XMLText & txt) override
       {
          std::cout << txt .Value();
          return true;
       }
    };
    
    int main()
    {
       XMLDocument doc;
       doc.Parse ("<div>The quick brown <b>fox</b> jumps over the <i>lazy</i> dog.</div>");
       auto div = doc .FirstChildElement();
       XMLPrintText prt;
       div -> Accept (&prt);
       return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多