• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

C++读取XML文件数据

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这四个头文件中(前三个较常用),头文件获取方式及在线手册在以下链接。

快速XML (sourceforge.net)

方法四: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());
        }
    }
}
 
全部回复(0)
正序查看
倒序查看
现在还没有回复呢,说说你的想法