Pugixml C++ parsing XML
I am a newbie in pugixml. Consider I have XML given here. Я хочу получить значение Name
а также Roll
of Every Student. The code below only find the tag but not the value.
#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;
}
Я хочу вывод имени и ролла для каждого студента. Как я могу изменить приведенный выше код? Кроме того, если можно сослаться сюда(нажмите Test), я могу напрямую написать xpath, который поддерживается pugixml. Если так, как я могу получить значения, которые я ищу, используя Xpath в Pugixml.
4 ответа
Спасибо Cornstalks за понимание использования xpath в pugixml. я использовал child_value
дано здесь. Мой код был таким:
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;
}
Я думаю, что причина, по которой вы получаете "теги / узлы" вместо их значений, заключается в том, что вы используете функцию name () вместо value (). Попробуйте вместо этого заменить itt->name() на itt->value(). Я нашел хорошую документацию о доступе к данным документа здесь
Вот как вы можете сделать это только с 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;
}
Во внутреннем цикле измените следующую строку, чтобы получить такие значения, как: student1 и 111 и так далее...
std::cout << itt.text().get() << " " << std::endl;