C#中读取xml文件通过添加引用 using System.Xml; 创建 通过XML 文档操作对象来读取
现在需要在c++中来读取xml文件,查阅资料发现比较常用的方法有以下四种:
Qt/TinyXml2/RapidXml/PugiXml
网上的执行效率对比图:PugiXml最快,所以就着重写下PugiXml
方法一、Qt
因为网友评论最慢,所以也没有去测试和实践
方法二:TinyXML
TinyXML下载地址:https://sourceforge.net/projects/tinyxml/
官方文档:TinyXML
TinyXML是个解析库,它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。
方法三、RapidXml
RapidXml是一个XML DOM解析工具包,适用于C++的xml解析器。整个解析器包含在rapidxml.hpp、rapidxml_utils.hpp、rapidxml_print.hpp、rapidxml_iterators.hpp这四个头文件中(前三个较常用),头文件获取方式及在线手册在以下链接。
方法四:PugiXml
pugixml是一个轻量级的C ++ XML操作库。
Pugixml包含三个文件pugixml.cpp、 pugixml.hpp 、 pugiconfig.hpp。
pugixml.hpp是主头文件,要使用pugixml类及其方法必须将它包含到工程中。pugiconfig.hpp是pugixml的配置文件,例如配置是否使用宽字符模式(#define PUGIXML_WCHAR_MODE)pugixml.cpp是源文件,该文件需设置为不使用预编译头。
表示树的c++类型只有三种(xml_document、xml_node、xml_attribute);xml_node上的某些操作仅对某些节点类型有效。它们描述如下。
Xml_document是整个文档结构的所有者;其功能包含加载/保存文档等,销毁它将销毁整个文档。xml_document的接口由加载函数、保存函数和xml_node的整个接口组成,该接口允许检查和/或修改文档。注意,虽然xml_document是xml_node的子类,但xml_node不是多态类型;继承只是为了简化使用。
Xml_node是文档节点的句柄;它可以指向文档中的任何节点,包括文档本身。所有类型的节点都有一个公共接口。注意,xml_node只是实际节点的句柄,而不是节点本身——可以有几个xml_node句柄指向相同的底层对象。销毁xml_node句柄不会销毁该节点,也不会将其从树中删除。
xml_node类型有一个特殊值,称为空节点或空节点。它不对应于任何文档中的任何节点,因此类似于空指针。但是,所有操作都是在空节点上定义的;通常,这些操作不做任何事情,返回空节点/属性或空字符串作为其结果。这对于链接调用很有用;也就是说,你可以像这样获得一个节点的祖父结点:node.parent().parent();如果一个节点是一个空节点或它没有父节点,第一个父()调用返回null节点;第二个parent()调用也返回null节点,因此您不必检查错误两次。你可以通过隐式布尔类型转换来测试句柄是否为空:if (node){…}或if (!node){…}。
xml_attribute是XML属性的句柄;它具有与xml_node相同的语义,即可以有多个xml_attribute句柄指向相同的底层对象,并且有一个特殊的null属性值,它将传播到函数结果。
使用:
<Root>
<students>
<student>
<name>张三</name>
<sex>男</sex>
</student>
<student>
<name>李四</name>
<sex>男</sex>
</student>
<student>
<name>王五</name>
<sex>女</sex>
</student>
</students>
</Root>
void Read()
{
pugi::xml_document doc;
if (doc.load_file("students.xml",pugi::parse_default,pugi::encoding_utf8))
{
pugi::xml_node root_node = doc.child(_T("Root"));
pugi::xml_node students_node = root_node.child(_T("students "));
// 分别读取每个学生信息
for (pugi::xml_node student_node = students_node.child(_T("student"));
student _node;
student _node = student _node.next_sibling(_T("student ")))
{
pugi::xml_node name_node = students_node.child(_T("name"));
printf("name : %s\n",name_node.first_child().value());
pugi::xml_node sex_node = student_node.child(_T("sex"));
printf("sex: %s\n",sex_node.first_child().value());
}
}
}