首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pugixml C++解析XML

Pugixml C++解析XML
EN

Stack Overflow用户
提问于 2015-01-08 15:47:52
回答 4查看 3.8K关注 0票数 1

我是pugixml的新手。假设我已经给出了这里。我想得到每个学生的NameRoll的价值。下面的代码只找到标记,但找不到值。

代码语言:javascript
复制
#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;
}

我要每个学生的名字和卷的输出。如何修改上述代码?另外,如果可以参考这里(按下测试),我可以直接编写pugixml支持的xpath。如果是这样的话,如何获得我在Pugixml中使用Xpath寻找的值。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-09 05:00:55

感谢@玉米秸秆在pugixml中使用xpath的洞察力。我用child_value这里。因此,我的法典是:

代码语言:javascript
复制
    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,从而使我的代码成为:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-01-08 16:05:10

下面是如何使用Xpath来完成这一任务:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-01-08 17:07:19

我认为,之所以要获取“标记/节点”而不是它们的值,是因为您使用的是name()函数而不是value()。尝试用itt->value()替换您的itt->name()。我发现了一些关于访问文档数据这里的好文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27844061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档