2015-01-08 16 views
0

Я новичок в pugixml. Рассмотрите, что я получил XML here. Я хочу получить значение Name и Roll каждого ученика. Код ниже содержит только тег, но не значение.Pugixml C++ parsing 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; 
} 

Я хочу получить имя и ролик для каждого учащегося. Как я могу изменить код выше? Кроме того, если можно обратиться к here (нажмите Test), я могу напрямую написать xpath, который поддерживается pugixml. Если да, как я могу получить значения, которые я ищу, используя Xpath в Pugixml.

ответ

0

Спасибо @Cornstalks за понимание использования xpath в pugixml. Я использовал 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-> name() на itt-> value(). Я нашел хорошую документацию о доступе к данным документа here

+0

Еще одна хорошая документация [здесь] (http://cdn.rawgit.com/zeux/pugixml/v1.5/docs/quickstart.html) –

0

В вашем внутреннем цикле измените следующую строку, чтобы получить значение, как: студент1 и 111 и т. д.

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