2012-03-21 62 views
1

嗯,我使用C中PugiXML ++使用Visual Studio 2010來獲得元素的含量,但事情是,它停下來所獲得的價值是看到了當「<」,所以它沒有得到的價值,它只是直到它到達即使「<」不打烊其元素的「<」角色獲得的內容。我希望它得到它,直到它達到它的結束標記,即使它忽略了標記,但只有內部標記內部的文本,至少。PugiXML C++元素(或標籤)的獲取內容

而且我也想知道如何獲得例如外XML,如果我取元素

pugi :: xpath_node_set工具= doc.select_nodes(「/網/邊界/ 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 

我希望我是再清楚不過, 在此先感謝

回答

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 lambda語法):

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 ::。