使用PugiXML的简易XPath程序失效,如何获取XML中node的attr1属性值?
使用PugiXML获取XML中的元素及attr1属性值
先看你提供的tree.xml内容:
<?xml version="1.0"?> <mesh name="mesh_root"> some text <![CDATA[someothertext]]> some more text <node attr1="value1" attr2="value2" /> <node attr1="value2"> <innernode/> </node> </mesh>
你之前的代码只写了一半,我帮你补全并调整,确保能正确获取所有<node>元素以及它们的attr1属性值。完整代码如下:
#include "pugixml.hpp" #include <iostream> using namespace pugi; int main() { xml_document doc; xml_parse_result result = doc.load_file("tree.xml"); // 先检查文件加载是否成功 if (!result) { std::cout << "XML文件加载失败,错误信息:" << result.description() << std::endl; return 1; } // 定义XPath查询:获取所有node元素 xpath_query query("//node"); xpath_node_set nodes = query.evaluate_node_set(doc); // 遍历所有匹配的node元素 for (xpath_node node : nodes) { xml_element elem = node.node(); std::cout << "找到<node>元素" << std::endl; // 获取attr1属性值,注意处理属性不存在的情况 const char* attr1_value = elem.attribute("attr1").value(); if (attr1_value && *attr1_value) { std::cout << "attr1属性值:" << attr1_value << std::endl; } else { std::cout << "该<node>元素没有attr1属性" << std::endl; } std::cout << "-------------------------" << std::endl; } return 0; }
关键调整点说明:
- XPath查询语句:用
//node可以匹配XML文档中所有层级的<node>元素,不管它在哪个位置。如果只想匹配<mesh>直接子节点的<node>,可以改成/mesh/node。 - 加载结果检查:增加了文件加载失败的判断,方便排查问题。
- 属性获取:使用
elem.attribute("attr1").value()获取属性值,同时做了空值判断,避免遇到没有attr1属性的元素时输出空内容。 - 遍历节点集:通过
xpath_node_set遍历所有匹配的节点,逐个处理每个<node>元素。
运行这段代码后,你会看到输出:
找到<node>元素 attr1属性值:value1 ------------------------- 找到<node>元素 attr1属性值:value2 -------------------------
内容的提问来源于stack exchange,提问作者user4035
相关产品推荐
相关产品推荐

