2017-04-11 325 views
0

如何从TinyXML2中的节点和子节点获取文本?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 

为什么它忽略了在<b><i>元素之后出现的所有文本?我该如何解决这个问题?此外,XMLPrinter类正确地打印出标签,但我不想标签。

回答

1

[主编14-APR-17,以改善(希望)。]

XMLPrinterXMLVisitor派生并在充分打印的XML文档(或元件),标签,属性和所有。 XMLVisitor做了递增和递减XML层次结构的工作,调用默认值,什么也不做,方法的实现方法为VisitEnter/VisitExit对于可以有后代(孩子)的节点,即文档和元素以及叶节点的“访问”,即文本,注释等。在派生类中重写这些方法以实现所需的功能。

第一个问题是您正在修改XMLPrinter。这源自XMLVisitor并创建XML文档的可打印表示。但那么你可以用你自己的方法全部替换XMLPrinter...方法。直接从XMLVisitor得到更好,更少的工作。

其次,你从VisitEnter单独使用GetText()当子节点嵌入它as documented here这将无法工作获得元素的文本。

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

#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; 
}