当前位置: 首页 > 工具软件 > pugixml > 使用案例 >

pugixml的应用--通过XPath读取xml文件

熊博远
2023-12-01

一、简介

我的第一篇博客决定献给刚做开发然后碰到了问题,帮了我很大忙的pugixml。最近在用c++解析xml的时候要用到XPath,搜了很多发现最主流的CMarkup不支持XPath,只有开发者版本也就是收钱的才支持,坑。然后发现了pugixml这个好东西,支持XPath,查了很多资料,小菜鸡的我官网的开发文档有点看不太懂,参考了两篇比较有用的博客:https://www.cnblogs.com/honker/p/3782352.html

https://blog.csdn.net/kds0714/article/details/89308915

写的都很不错,但都不是很符合我需要的,我需要通过pugixml的XPath模块读取相应的xml文件信息

二、配置

原文中写的很清楚了,pugixml的官网:http://pugixml.org/下载文件压缩包,解压后有三个文件,可以只include头文件pugixml.hpp和pugiconfig.hpp,CPP文件不用放到项目中

方法是,在pugiconfig.hpp中:

1

2

3

// Uncomment this to switch to header-only version

 #define PUGIXML_HEADER_ONLY

 #include "pugixml.cpp"

将这两行的注释去掉就可以了。

另外,如果项目使用的是Unicode设置,则可以在pugiconfig.hpp中:

1

2

// Uncomment this to enable wchar_t mode

 #define PUGIXML_WCHAR_MODE

将wchar模式打开即可。

三、使用

XML文件: 

<?xml version="1.0" encoding="utf-8" standalone="no"?>

<!DOCTYPE Documents SYSTEM "\DTDS\ipphdb-entities.dtd"[]>

<root>
    <student id="001" name = "zhangsan">
        <hobby id="1">basketball</hobby >
        <hobby id="2">pingpong</hobby >
    </student>
    <student id="002" name = "lisi">
        <hobby id="1">football</hobby >
        <hobby id="2">swimming</hobby >
    </student>
    <student id="003" name = "wangwu">
        <hobby id="1">run</hobby >
    </student>
</root>

C++:

获取标签值:

BOOL GetXmlData(std::wstring const xmlfile_path){ 
    //传入的是要解析的xml文件路径
    CString strXmlPath = xmlfile_path.c_str();

    //使用pugixml解析
    pugi::xml_document xmldoc; 

    //加载配置文件
    pugi::xml_parse_result result = xmldoc.load_file(strXmlPath);
    if (result.status != pugi::status_ok)
        return FALSE; 

    CString xpath_tmp = _T("/root/student[@name='zhangsan'and@id='001']/hobby");
    //指定一个路径给xQuery
    pugi::xpath_query xQuery(xpath_tmp);
    
    //选择这个路径下对应的节点
    pugi::xpath_node sequence_tool = xmldoc.select_node(xQuery);
    //获取这个节点下对应的第一个值
    std::wstring n_sequence = sequence_tool.node().first_child().value();
    
    return TRUE;
}

获取到的对应标签值为:basketball

获取属性值:

BOOL GetXmlData(std::wstring const xmlfile_path){ 
    //传入的是要解析的xml文件路径
    CString strXmlPath = xmlfile_path.c_str();

    //使用pugixml解析
    pugi::xml_document xmldoc; 

    //加载配置文件
    pugi::xml_parse_result result = xmldoc.load_file(strXmlPath);
    if (result.status != pugi::status_ok)
        return FALSE; 

    CString xpath_tmp = _T("/root/student[@id='003']/hobby@id");
    //指定一个路径给xQuery
    pugi::xpath_query xQuery(xpath_tmp);
    
    //选择这个路径下对应的节点
    pugi::xpath_node sequence_tool = xmldoc.select_node(xQuery);
    //获取这个节点属性下对应的属性值,并赋值给n_sequence
    std::wstring n_sequence = sequence_tool.attribute().value();

    return TRUE;
}

获取到的对应属性值为:1

 四、总结

        好几天前用的了有些忘了,没有测试但大体意思是对的,大家用的话参考就行,或者自己测试下,第一次写博客写的不是很好,有错的地方欢迎指正,大家一起学习

 类似资料: