2012-03-21 2 views
1

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

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

Pugi :: xpath_node_set инструменты = doc.select_nodes («/ сетки/оценки/б»); , что мне делать, чтобы получить весь контент, который будет «Ссылка Till здесь»

это содержание того же дано здесь:

#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 

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

ответ

2

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

4

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

Самый простой способ сделать это состоит в использовании 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; }); 

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

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

Получение внутреннего XML потребует переборе детей узла и добавление их внешний XML к результату, т.е.

ostringstream oss; 
for (pugi::xml_node_iterator it = node.begin(); it != node.end(); ++it) 
    it->print(oss); 
string xml = oss.str(); 
1

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

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

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

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

Смежные вопросы