PugiXML C ++ получает содержимое элемента (или тега) - PullRequest
1 голос
/ 21 марта 2012

Ну, я использую PugiXML в C ++, используя Visual Studio 2010 для получения содержимого элемента, но дело в том, что он останавливается на получении значения, когда видит «<», поэтому он не получает значение он просто получает содержимое, пока не достигнет символа «<», даже если «<» не закрывает свой элемент. Я хочу, чтобы он получал, пока не достигнет своего закрывающего тега, даже если он игнорирует теги, но, по крайней мере, только текст внутри внутренних тегов. </p>

И я также хотел бы знать, как получить Outer XML, например, если я получу элемент

pugi :: xpath_node_set tools = doc.select_nodes ("/ mesh / bounds / b"); Что мне делать, чтобы получить весь контент, который будет "Ссылка до здесь"

этот контент такой же, как здесь:

#include "pugixml.hpp"

#include <iostream>
#include <conio.h>
#include <stdio.h>

using namespace std;

int main//21
    () {
    string source = "<mesh name='sphere'><bounds><b id='hey'> <a DeriveCaptionFrom='lastparam' name='testx' href='http://www.google.com'>Link Till here<b>it will stop here and ignore the rest</b> text</a></b> 0 1 1</bounds></mesh>";

    int from_string;
    from_string = 1;

    pugi::xml_document doc;
    pugi::xml_parse_result result;
    string filename = "xgconsole.xml";
    result = doc.load_buffer(source.c_str(), source.size());
    /* result = doc.load_file(filename.c_str());
    if(!result){
        cout << "File " << filename.c_str() << " couldn't be found" << endl;
        _getch();
        return 0;
    } */

        pugi::xpath_node_set tools = doc.select_nodes("/mesh/bounds/b/a[@href='http://www.google.com' and @DeriveCaptionFrom='lastparam']");

        for (pugi::xpath_node_set::const_iterator it = tools.begin(); it != tools.end(); ++it) {
            pugi::xpath_node node = *it;
            std::cout << "Attribute Href: " << node.node().attribute("href").value() << endl;
            std::cout << "Value: " << node.node().child_value() << endl;
            std::cout << "Name: " << node.node().name() << endl;

        }

    _getch();
    return 0;
}

вот вывод:

Attribute Href: http://www.google.com
Value: Link Till here
Name: a

Надеюсь, я был достаточно ясен, Заранее спасибо

Ответы [ 3 ]

6 голосов
/ 22 марта 2012

Мои психические силы говорят мне, что вы хотите знать, как получить объединенный текст всех дочерних элементов узла (он же внутренний текст).

Самый простой способ сделать это - использовать XPath следующим образом:

pugi::xml_node node = doc.child("mesh").child("bounds").child("b");
string text = pugi::xpath_query(".").evaluate_string();

Очевидно, что вы можете написать свою собственную рекурсивную функцию, которая объединяет значения PCDATA / CDATA из поддерева;использование встроенного средства рекурсивного обхода, такого как find_node, также будет работать (используя лямбда-синтаксис C ++ 11):

string text;
text.find_node([&](pugi::xml_node n) -> bool { if (n.type() == pugi::node_pcdata) result += n.value(); return false; });

Теперь, если вы хотите получить все содержимое тега (иначеexternal xml), вы можете вывести узел в строковый поток, например:

ostringstream oss;
node.print(oss);
string xml = oss.str();

Для получения внутреннего xml потребуется выполнить итерацию по дочерним узлам узла и добавить их внешний xml к результату, т.е.

2 голосов
/ 21 марта 2012

Вот как работает XML.Вы не можете встраивать < или > прямо в свои значения.Избегайте их (например, используя объекты HTML, такие как &lt; и &gt;) или определите раздел CDATA .

1 голос
/ 05 мая 2013

Я много боролся с проблемой анализа поддерева, включающего все элементы и подузлы - самый простой способ - это почти то, что показано здесь:

Вы должны использовать этот код:

ostringstream oss;
oNode.print(oss, "", format_raw);
sResponse = oss.str();

Вместо oNode используйте нужный вам узел, при необходимости используйте pugi :: перед каждой функцией.

...