一、简介
我的第一篇博客决定献给刚做开发然后碰到了问题,帮了我很大忙的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 |
|
将这两行的注释去掉就可以了。
另外,如果项目使用的是Unicode设置,则可以在pugiconfig.hpp中:
1 2 |
|
将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
四、总结
好几天前用的了有些忘了,没有测试但大体意思是对的,大家用的话参考就行,或者自己测试下,第一次写博客写的不是很好,有错的地方欢迎指正,大家一起学习