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-апреля-17 для улучшения (я надеюсь).]
XMLPrinter
происходит от XMLVisitor
и печатает XML-документ (или элемент) полностью, теги, атрибуты и все. XMLVisitor
выполняет работу по повторению вверх и вниз по иерархии XML, вызывая default, ничего не делая, реализации методов VisitEnter
/VisitExit
для узлов, которые могут иметь потомков (дочерних элементов), то есть документы и элементы и `` Визит` для конечных узлов, т.е. текста, комментариев и т. д. Переопределите эти методы в производном классе для реализации желаемой функциональности.
Первая проблема заключается в том, что вы модифицируете XMLPrinter
, Это вытекает из XMLVisitor
и создает печатаемое представление документа XML. Но тогда вы замените все XMLPrinter
посещение... методы с вашим собственным. Было бы гораздо лучше и меньше работы, чтобы извлечь из XMLVisitor
непосредственно.
Во-вторых, вы получаете текст элемента от VisitEnter
в одиночку GetText()
который не будет работать, когда в него встроены дочерние узлы, как описано здесь.
В этом случае, чтобы получить только текст всех элементов переопределить 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;
}