2017-04-11 446 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; 
}