2015-01-08 88 views
0

我是pugixml的新手。考慮我給了XML here。我想要得到每個學生的價值NameRoll。下面的代碼只能找到標籤,而不是價值。Pugixml C++解析XML

#include <iostream> 
#include "pugixml.hpp" 

int main() 
{ 
    std::string xml_mesg = "<data> \ 
    <student>\ 
     <Name>student 1</Name>\ 
     <Roll>111</Roll>\ 
    </student>\ 
    <student>\ 
     <Name>student 2</Name>\ 
     <Roll>222</Roll>\ 
    </student>\ 
    <student>\ 
     <Name>student 3</Name>\ 
     <Roll>333</Roll>\ 
    </student>\ 
</data>"; 
    pugi::xml_document doc; 
    doc.load_string(xml_mesg.c_str()); 
    pugi::xml_node data = doc.child("data"); 
    for(pugi::xml_node_iterator it=data.begin(); it!=data.end(); ++it) 
    { 
     for(pugi::xml_node_iterator itt=it->begin(); itt!=it->end(); ++itt) 
      std::cout << itt->name() << " " << std::endl; 
    } 
    return 0; 
} 

我想爲每個學生輸出Name和Roll。我如何修改上面的代碼?另外,如果可以參考here(按測試),我可以直接編寫pugixml支持的xpath。如果是這樣,我怎麼才能得到我在Pugixml中使用Xpath尋找的值。

回答

0

感謝@Cornstalks以瞭解在pugixml中使用xpath。我使用child_value給出here。我的代碼是這樣的:

for(pugi::xml_node_iterator it=data.begin(); it!=data.end(); ++it) 
    { 
     for(pugi::xml_node_iterator itt=it->begin(); itt!=it->end(); ++itt) 
      std::cout << itt->name() << " " << itt->child_value() << " " << std::endl; 
    } 

我還可以使用XPath作爲@Cornstalks建議從而使我的代碼爲:

pugi::xml_document doc; 
doc.load_string(xml_mesg.c_str()); 
pugi::xpath_query student_query("/data/student"); 

pugi::xpath_query name_query("Name/text()"); 
pugi::xpath_query roll_query("Roll/text()"); 

pugi::xpath_node_set xpath_students = doc.select_nodes(student_query); 
for (pugi::xpath_node xpath_student : xpath_students) 
{ 
    // Since Xpath results can be nodes or attributes, you must explicitly get 
    // the node out with .node() 
    pugi::xml_node student = xpath_student.node(); 

    pugi::xml_node name = student.select_node(name_query).node(); 
    pugi::xml_node roll = student.select_node(roll_query).node(); 

    std::cout << "Student name: " << name.value() << std::endl; 
    std::cout << "  roll: " << roll.value() << std::endl; 
} 
1

這裏是你如何可以只用Xpath的做到這一點:

pugi::xpath_query student_query("/data/student"); 

pugi::xpath_query name_query("Name/text()"); 
pugi::xpath_query roll_query("Roll/text()"); 

pugi::xpath_node_set xpath_students = doc.select_nodes(student_query); 
for (pugi::xpath_node xpath_student : xpath_students) 
{ 
    // Since Xpath results can be nodes or attributes, you must explicitly get 
    // the node out with .node() 
    pugi::xml_node student = xpath_student.node(); 

    pugi::xml_node name = student.select_node(name_query).node(); 
    pugi::xml_node roll = student.select_node(roll_query).node(); 

    std::cout << "Student name: " << name.value() << std::endl; 
    std::cout << "  roll: " << roll.value() << std::endl; 
} 
+0

謝謝我會試試這個,但是我怎樣才能改變我的代碼,使它獲得我想要的價值? – Pant

+0

只要把我的代碼放在'doc.load_string(xml_mesg.c_str());' – Cornstalks

+0

'之後,我的意思是在我的代碼中使用迭代器。 – Pant

0

我認爲,爲什麼你得到的,而不是他們的價值觀的「標籤/節點」的原因是因爲你正在使用的名稱()函數而不是value()。嘗試用itt-> value()替代你的itt-> name()。 我發現了一些關於訪問文檔數據的很好的文檔here

+0

一些更好的文檔[這裏](http://cdn.rawgit.com/zeux/pugixml/v1.5/docs/quickstart.html) –

0

在你的內部循環更改以下行來得到這樣的價值觀: student1和111等等......

std::cout << itt.text().get() << " " << std::endl;