如何使用pugixml读取节点

How to read through nodes using pugixml?

本文关键字:节点 读取 pugixml 何使用      更新时间:2023-10-16

我刚刚下载了pugixml库,我正试图使其适应我的需要。它主要是面向DOM风格,我不使用。我存储的数据如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<profile>
    <points>
        <point>
            <index>0</index>
            <x>0</x>
            <y>50</y>
        </point>
        <point>
            <index>1</index>
            <x>2</x>
            <y>49.9583</y>
        </point>
        <point>
            <index>2</index>
            <x>12</x>
            <y>50.3083</y>
        </point>
     </points>
</profile>

Pugixml指南说:

将数据存储为某些节点的文本内容是很常见的。这是一个节点。在这种情况下,Node没有值,而是有的子节点输入node_pcdata,值为"这是一个节点"。pugixml提供Child_value()和text()帮助函数解析这些数据。

但是我使用这些方法有问题,我没有得到节点值。

#include "pugixml.hpp"
#include <string.h>
#include <iostream>
int main()
{
    pugi::xml_document doc;
    if (!doc.load_file("/home/lukasz/Programy/eclipse_linux_projects/xmlTest/Debug/pidtest.xml"))
        return -1;
    pugi::xml_node points = doc.child("profile").child("points");
    for (pugi::xml_node point = points.first_child(); point; point = points.next_sibling())
    {
        // ?
    }

    return 0;
}

如何读取索引,x和y值里面的for?

有几种方法,在快速入门页面中有说明:

  • http://pugixml.org/docs/samples/traverse_iter.cpp
  • http://pugixml.org/docs/samples/traverse_rangefor.cpp
  • 有一个用于电源作业的树访问者http://pugixml.org/docs/samples/traverse_walker.cpp

我可以推荐Xpath吗?

#include <pugixml.hpp>
#include <iostream>
int main()
{
    pugi::xml_document doc;
    if (doc.load_file("input.txt")) {
        for (auto point : doc.select_nodes("//profile/points/point")) {
            point.node().print(std::cout, "", pugi::format_raw);
            std::cout << "n";
        }
    }
}

打印

<point><index>0</index><x>0</x><y>50</y></point>
<point><index>1</index><x>2</x><y>49.9583</y></point>
<point><index>2</index><x>12</x><y>50.3083</y></point>