C/C++ xml库

文章目录

  • 一、介绍
    • 1.1 xml 介绍
    • 1.2 xml 标准
    • 1.3 xml 教程
    • 1.4 xml 构成
  • 二、C/C++ xml 库选型
    • 2.1 选型范围
    • 2.2 RapidXML
    • 2.3 tinyxml2
    • 2.4 pugixml
    • 2.5 libxml++
  • 五、性能比较
    • 5.1 C++ xml 相关的操作有哪些
    • 5.2 rapidxml、Pugixml、TinyXML2 文件读取性能比较
  • 六、其他问题
    • 6.1 version和 encoding的取值范围

一、介绍

1.1 xml 介绍

XML(eXtensible Markup Language,可扩展标记语言)是一种标记语言,主要用于存储和传输数据。它定义了数据的结构和语义,但不定义数据的呈现方式。XML 是一种自描述的语言,易于理解和使用。以下是 XML 的一些关键特点:

  1. 可扩展性:用户可以定义自己的标签,使其适应不同的需求。
  2. 自描述性:标签本身描述了数据的内容和结构。
  3. 简洁性:与HTML相比,XML标签更简洁,减少了冗余。
  4. 可读性:标签清晰,易于人类阅读和理解。
  5. 跨平台:可以在任何操作系统上使用,与平台无关。
  6. 数据交换:广泛用于不同系统之间的数据交换。

1.2 xml 标准

  • XML 1.0:1998年2月首次发布,是XML的基础版本。
  • XML 1.0 第二版:2000年10月发布,包含了一些修正和澄清。
  • XML 1.1:2001年2月发布,旨在解决XML 1.0中的一些问题,特别是字符编码和特殊字符的处理。
  • XML 1.1 第二版:2006年4月发布,包含了对XML 1.1的一些小的修正和改进。(改进了字符编码处理,支持更多的 Unicode 字符)

要查看 XML 的历史规范和标准,可以访问以下资源:

  1. W3C 官方网站

    • https://www.w3.org/TR/
    • 这是查看 XML 规范和其他 Web 标准的主要资源。
  2. XML 1.0 规范

    • https://www.w3.org/TR/REC-xml/
    • https://www.w3.org/TR/xml11/
    • https://www.w3.org/TR/2008/REC-xml-20081126/
  3. XML 1.1 规范

    • https://www.w3.org/TR/xml11/
    • https://www.w3.org/TR/2006/REC-xml11-20060816/
  4. W3C XML 活动页面

    • https://www.w3.org/XML/
    • 提供了关于 XML 技术的最新信息和资源。
  5. 互联网档案馆

    • https://archive.org/
    • 有时可以找到早期的规范文档和历史版本。

通过这些资源,你可以获取 XML 的详细规范、历史版本和相关的技术文档。这有助于了解 XML 的发展历史和当前标准。

1.3 xml 教程

  • XML 简介
  • https://www.runoob.com/
  • https://www.w3school.com.cn/xml/index.asp
  • https://www.cnblogs.com/antLaddie/p/14823874.html
  • DOM 和 SAX

在这里插入图片描述

1.4 xml 构成

XML(Extensible Markup Language,可扩展标记语言)文档由以下基本构成要素组成:

  1. XML声明 (<?xml version="1.0" encoding="UTF-8"?>): 可选的,位于文档最开始,用来指定XML版本和字符编码等信息。

  2. 元素 (Elements): XML文档的基本构建块,有开始标签(如 <item>)和结束标签(如 </item>),元素可以包含文本、其他元素或者属性。

  3. 属性 (Attributes): 元素可以有属性,用来提供额外信息。属性在元素的开始标签内定义(如 <item id="123">),属性值必须加引号。

  4. 文本 (Text): 元素内部的字符数据,可以是文本或者实体引用。

  5. 注释 (Comments): 以 <!-- 开始,--> 结束,用于添加文档的注释信息,它们在XML文档中会被忽略。

  6. 处理指令 (Processing Instructions): 以 <? 开始,?> 结束,用于提供处理器指令(如XML声明),通常用于指定文档相关的配置信息。

  7. 文档类型声明 (Document Type Declaration, DTD): 以 <!DOCTYPE 开始,用来定义文档的结构和元素的合法性规则,可以包含元素和属性的声明。

  8. CDATA区 (Character Data): 以 <![CDATA[ 开始,]]> 结束,用来包含不应被XML解析器解析的文本。

  9. 实体 (Entities): 可以是字符引用(如 &lt; 表示 <)或实体引用(如 &copy; 表示版权符号),用于表示特殊或不可见的字符。

  10. 命名空间 (Namespaces): 用于区分相同名称的不同元素和属性,避免命名冲突。

  11. 属性列表 (Attribute List): 某些元素可以有一系列的属性,这些属性提供了关于元素的附加信息。

一个简单的XML文档示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<catalog><book id="bk101"><author>Gambardella, Matthew</author><title>XML Developer's Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date><description>An in-depth look at creating applications with XML.</description></book><!-- More book elements can go here -->
</catalog>

在这个示例中,catalog 是根元素,book 是子元素,每个 book 元素有多个子元素如 authortitle 等,以及一个 id 属性。

二、C/C++ xml 库选型

2.1 选型范围

  • 资料
    • https://rapidxml.sourceforge.net/manual.html
    • C/C++ xml库比较
    • xml解析库对比总结(解析方式,第三方库,TinyXml)
    • 深入对比XML处理库:Mini-XML、TinyXML-2与libxml2
    • C++类库Pugixml与rapidxml性能评测
  • 开源库
    1. RapidXML、cereal-RapidXML:仅DOM方式、速度快、v1.3 2009
    2. pugixml:仅DOM方式、速度快、支持XPath1.0查询、C++、好集成、v10.0.0 2023-10-31
    3. libxml
      • libxml2:C
      • libxml++:C++
    4. tinyxml2:C++、好集成、API简单
  • 结论
    • 性能:RapidXML 和 PugiXML 在解析大型XML文件时表现优异。 (时间和空间)
    • 易用性:TinyXML2 和 PugiXML 的API设计简洁直观,易于学习和使用。
    • 功能全面性:libxml2 和 libxml++ 提供了最全面的功能,包括XML验证、XPath查询和XSLT转换-
    • 选择哪个库取决于你的具体需求,例如是否需要XPath支持、是否需要处理大型文件、是否需要C++绑定等。根据这些因素,你可以决定最适合你项目的XML库。

在这里插入图片描述

2.2 RapidXML

  • 注意:cereal 序列化库选用RapidXML和RapidJSON,可见其性能强劲。
  • 官网: https://rapidxml.sourceforge.net/
    • 最新版本和更新时间:v1.3 2009/05/13 01:46:17
  • 官网手册: https://rapidxml.sourceforge.net/manual.html
  • 第三方源码:https://github.com/Fe-Bell/RapidXML
  • c++开源库rapidxml介绍与示例
  • rapidxml 文件读写,增加删除节点

2.3 tinyxml2

  • https://github.com/leethomason/tinyxml2
  • 最新版本和更新时间:v10.0.0 2023-10-31
  • C++那些事之优雅的解析XML
  • TinyXML2使用教程
  • tinyxml2使用方法
  • C++ XML 库 TinyXML2 的基本使用

使用方式:

  1. 源码集成:仅 tinyxml2.h 和 tinyxml2.cpp 两个文件
  2. 库集成:tinyxml2.h 和 静/动态库

在这里插入图片描述

2.4 pugixml

  • Pugixml一种快速解析XML文件的开源解析库
  • 官网:https://pugixml.org/
  • 源码:https://github.com/zeux/pugixml
    • 当前最新版本和更新时间:v1.14_2023-10-02
  • C/C++编程:pugixml
  • https://www.cnblogs.com/Gale-Tech/p/16089326.html
  • https://blog.csdn.net/FL1768317420/article/details/136385775
    在这里插入图片描述

2.5 libxml++

  • https://libxmlplusplus.sourceforge.net/

  • https://libxmlplusplus.github.io/libxmlplusplus/

  • https://github.com/libxmlplusplus/libxmlplusplus

  • libxml2:

    • 官网地址:http://xmlsoft.org/
    • 源码地址:http://xmlsoft.org/sources/

在这里插入图片描述

五、性能比较

5.1 C++ xml 相关的操作有哪些

在 C++ 中,XML 相关的操作可以通过多种库来实现,这些操作包括但不限于:

  1. 解析(Parsing)

    • 将 XML 字符串或文件解析为一个可操作的内部结构,通常是 DOM(Document Object Model)。
  2. 序列化(Serialization)

    • 将 DOM 或其他内存中的结构转换回 XML 格式的字符串或写入文件。
  3. 查询(Querying)

    • 使用 XPath 表达式在 XML 文档中查找特定的元素或属性。
  4. 修改(Modifying)

    • 编辑 XML 文档的内容,包括添加、删除或更改元素和属性。
  5. 创建(Creating)

    • 从头开始构建 XML 文档,添加元素和属性。
  6. 验证(Validating)

    • 检查 XML 文档是否符合某个模式(如 DTD 或 XML Schema)。
  7. 遍历(Traversal)

    • 通过 DOM 遍历 XML 文档的节点。
  8. 操作属性(Manipulating Attributes)

    • 获取和设置 XML 元素的属性。
  9. 处理命名空间(Handling Namespaces)

    • 管理 XML 文档中的命名空间。
  10. 事件驱动解析(Event-driven Parsing)

    • 使用 SAX(Simple API for XML)风格的接口进行事件驱动的解析。
  11. 转换(Transformation)

    • 使用 XSLT(eXtensible Stylesheet Language Transformations)转换 XML 文档。
  12. 生成(Generation)

    • 动态生成 XML 数据,例如作为 API 响应。

在 C++ 中,一些流行的 XML 处理库包括:

  • TinyXML and TinyXML-2:轻量级的 XML 解析库,提供基本的解析和序列化功能,但不直接支持 XPath。
  • RapidXML:一个快速的、不使用异常的 DOM 解析器,同样不提供 XPath 支持。
  • libxml2:一个功能全面的 XML 库,支持 DOM、SAX、XPath 和 XSLT。
  • PugiXML:一个轻量级的、简单易用的 XML 解析库,支持 XPath 查询。
  • Xerces-C++:一个基于 Apache Xerces 的 XML 解析库,支持 DOM、SAX 和 XPath。

使用这些库,开发者可以执行上述的 XML 操作,以满足不同的开发需求。选择哪个库取决于项目的具体需求、性能考虑以及个人偏好。

5.2 rapidxml、Pugixml、TinyXML2 文件读取性能比较

  • 测试: 读文件
  • 结论:
    • 小文件:rapidxml 速度 >> Pugixml ≈ TinyXML2
    • 大文件:Pugixml > rapidxml > TinyXML2
// g++ -o test-xml main.cpp pugixml-1.14/pugixml.cpp tinyxml2-10.0.0/tinyxml2.cpp
#include <iostream>
#include "pugixml-1.14/pugixml.hpp"
#include "pugixml-1.14/pugiconfig.hpp"
#include <sys/time.h>#include "rapidxml-1.13/rapidxml.hpp"
#include "rapidxml-1.13/rapidxml_print.hpp"
#include "rapidxml-1.13/rapidxml_utils.hpp"#include "tinyxml2-10.0.0/tinyxml2.h"using namespace std;#define TEST_TIMES 10int pugixmltestmain( void )
{pugi::xml_document doc;timeval starttime, endtime;double timeuse = 0.;double timeAverage = 0.;for( int i = 0; i < TEST_TIMES; ++i ){gettimeofday( &starttime, 0 );if( !doc.load_file( "xml/login.xml" ) ){cout << "failed in load xml file! _ " << i << endl;continue;}gettimeofday( &endtime, 0 );timeuse = 1000000. * (endtime.tv_sec - starttime.tv_sec) + endtime.tv_usec - starttime.tv_usec;timeuse *= 0.001 ;cout << " reading files costs : " << timeuse << "ms" << endl;timeAverage += timeuse;}timeAverage /= TEST_TIMES;cout << " \n** The end *******************\n  pugixmltest  the average costs = " << timeAverage << "ms\r\n\r\n" << endl;return 0;
}using namespace rapidxml;
using std::cout;
using std::endl;int rapidxmltestmain()
{timeval starttime, endtime;double timeuse = 0.;double timeAverage = 0.;//< parse xmlfor( int i = 0 ; i < TEST_TIMES; ++i ){rapidxml::file<> filename( "xml/login.xml" );xml_document<> doc;gettimeofday( &starttime, 0 );doc.parse<0>( filename.data() );gettimeofday( &endtime, 0 );timeuse = 1000000. * (endtime.tv_sec - starttime.tv_sec) + endtime.tv_usec - starttime.tv_usec;timeuse *= 0.001 ;cout << " reading files costs : " << timeuse << "ms" << endl;doc.clear();timeAverage += timeuse;}timeAverage /= TEST_TIMES;cout << " \n** The end *******************\n  rapidxmltest  the average costs = " << timeAverage << "ms\r\n\r\n" << endl;return 0;
}using namespace tinyxml2;
int tinyxml2testmain( void )
{XMLDocument doc;// doc.LoadFile( "resources/dream.xml" );// doc.ErrorID();timeval starttime, endtime;double timeuse = 0.;double timeAverage = 0.;for( int i = 0; i < TEST_TIMES; ++i ){gettimeofday( &starttime, 0 );if( XML_SUCCESS != doc.LoadFile( "xml/login.xml" ) ){cout << "failed in load xml file! _ " << i << endl;continue;}gettimeofday( &endtime, 0 );timeuse = 1000000. * (endtime.tv_sec - starttime.tv_sec) + endtime.tv_usec - starttime.tv_usec;timeuse *= 0.001 ;cout << " reading files costs : " << timeuse << "ms" << endl;timeAverage += timeuse;}timeAverage /= TEST_TIMES;cout << " \n** The end *******************\n  tinyxml2test  the average costs = " << timeAverage << "ms\r\n\r\n" << endl;return 0;
}
int main()
{pugixmltestmain();rapidxmltestmain();tinyxml2testmain();
}

如果没有xml文件 就在测试目录增加一个xml目录,里面创建login.xml
Xml内容如下

<?xml version="1.0"?>
<Request><PK_Type><Name>LOGIN</Name></PK_Type><Info><UserName>admin</UserName><PassWord>21232f297a57a5a743894a0e4a801fc3</PassWord><FSUID>26201907030003</FSUID><FSUIP>172.16.88.192</FSUIP><FSUMAC>00-0c-29-de-4c-58</FSUMAC><FSUVER>1.0.01</FSUVER></Info>
</Request>
  • 测试大文件:197KB
    在这里插入图片描述
  • 测试小文件:1KB
    在这里插入图片描述

六、其他问题

6.1 version和 encoding的取值范围

<?xml version="1.0" encoding="ISO-8859-1"?>其中version和 encoding的取值范围在哪可以查

<?xml version="1.0" encoding="ISO-8859-1"?> 是 XML 文档的声明,位于文档的最前面。这个声明用于告诉解析器有关 XML 文档的版本和编码信息。

  • version 属性指定了 XML 文档使用的 XML 版本,目前最常见的是 “1.0”。W3C 定义的 XML 1.0 标准有两个版本:1.0 和 1.1。因此,version 属性的取值范围通常为 “1.0” 或 “1.1”。

  • encoding 属性指定了 XML 文档使用的字符编码。XML 允许使用多种字符编码,包括但不限于:

    • UTF-8
    • UTF-16
    • ISO-8859-1(Latin-1 Western European)
    • ISO-8859-2(Latin-2 Central European)
    • ISO-8859-3(Latin-3 South European)
    • ISO-8859-4(Latin-4 North European)
    • ISO-8859-5(Latin/Cyrillic)
    • ISO-8859-6(Latin/Arabic)
    • ISO-8859-7(Latin/Greek)
    • ISO-8859-8(Latin/Hebrew)
    • ISO-8859-9(Latin-5 Turkish)
    • 等等

要查找 versionencoding 的取值范围,可以查阅以下资源:

  1. XML 1.0 标准:定义了 XML 的基本语法和行为,包括版本信息。可以在 W3C 的官方网站上找到:XML 1.0 Specification。

  2. XML 1.1 标准:在 XML 1.0 的基础上做了一些扩展,包括对更多字符编码的支持。可以在 W3C 的官方网站上找到:XML 1.1 Specification。

  3. 字符编码标准:如 IANA(Internet Assigned Numbers Authority)Character Sets 列出了多种字符编码。

  4. W3C 的 Encoding 标准:提供了关于 Web 文档字符编码的详细信息,包括如何在 HTTP 头部和 HTML 中指定编码:Character Encoding for HTML & XML。

通过这些资源,您可以找到所有有效的 XML 版本和编码选项,以及它们的使用方式和限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程-TCP 协议的三次握手和四次挥手做了什么

TCP 协议概述 1. TCP 协议简介 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 协议提供可靠的通信服务&#xff0c;通过校验和、序列号、确认应答、重传等机制保证数据传输…

MYSQL——库表操作

MYSQL——库表操作 1.1 SQL语句基础1.1.1. SQL简介1.1.2. SQL语句分类1.1.3. SQL语句的书写规范 1.2数据库的操作1.2.1 数据库的登录及退出1.2.2查看数据库 作业 1.1 SQL语句基础 1.1.1. SQL简介 SQL:结构化查询语言(Structured Query Language)&#xff0c;在关系型数据库上…

【ffmpeg入门】安装CUDA并使用gpu加速

文章目录 前言CUDACUDA是什么CUDA 的主要组成部分CUDA 的优点CUDA 的基本编程模型安装CUDA ffmpeg使用gpu加速为什么需要使用gpu加速1. 提高处理速度2. 减少 CPU 负载3. 提高实时处理能力4. 支持高分辨率和复杂编码格式5. 提供更好的可扩展性6. 提高能效 ffmpeg使用gpu加速常用…

【CMU博士论文】结构化推理增强大语言模型(Part 0)

问题 &#xff1a;语言生成和推理领域的快速发展得益于围绕大型语言模型的用户友好库的普及。这些解决方案通常依赖于Seq2Seq范式&#xff0c;将所有问题视为文本到文本的转换。尽管这种方法方便&#xff0c;但在实际部署中存在局限性&#xff1a;处理复杂问题时的脆弱性、缺乏…

单片机主控的基本电路

论文 1.复位电路 2.启动模式设置接口 3.VBAT供电接口 4.MCU 基本电路 5.参考电压选择端口

python处理彩色图像通道拆分与合并

彩色图像通道拆分与合并 1. 使用 opencv2. 使用 numpy 待处理图像 ML.jpg 1. 使用 opencv import cv2 import matplotlib.pyplot as plt import numpy as np # 读取图像 # 读取图像 image cv2.imread(ML.jpg) plt.imshow(image) print(type(image)) # 输出&#xff1a;<…

Artix7系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTP高速接口,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的以太网方案本博已有的FPGA图像缩放方案本方案的缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡…

【BUG】已解决: KeyboardInterrupt

已解决&#xff1a; KeyboardInterrupt 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.net、C…

vue v-for展示元素分两栏 中间使用分割线

1.效果展示: 2.代码展示: <template><div class"container"><div class"column" v-for"(item, index) in items" :key"index"><div class"item">{{ item }}</div><div v-if"index %…

注册安全分析报告:东方航空

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

LeetCode 394, 61, 100

目录 394. 字符串解码题目链接标签思路代码 61. 旋转链表题目链接标签思路代码 100. 相同的树题目链接标签思路代码递归版前序遍历层序遍历 394. 字符串解码 题目链接 394. 字符串解码 标签 栈 递归 字符串 思路 本题可以使用两个栈来解决&#xff0c;一个栈 timesStack …

开源安全态势感知平台Security Onion

简介 Security Onion是一款由安全防御人员为安全防御人员构建的免费开放平台。它包括网络可见性、主机可见性、入侵检测蜜罐、日志管理和案例管理等功能。详细信息可以查看官网Security Onion Solutions 在网络可见性方面&#xff0c;Security Onion提供了基于签名的检测&…

JAVA:Filer过滤器+案例:请求IP访问限制和请求返回值修改

JAVA&#xff1a;Filer过滤器 介绍 Java中的Filter也被称为过滤器&#xff0c;它是Servlet技术的一部分&#xff0c;用于在web服务器上拦截请求和响应&#xff0c;以检查或转换其内容。 Filter的urlPatterns可以过滤特定地址http的请求&#xff0c;也可以利用Filter对访问请求…

Wireshark抓取HTTP

HTTP请求响应 使用wireshark抓取 本地机器是192.168.33.195&#xff0c;远程机器是192.168.32.129&#xff0c;远程HTTP服务端口是9005 TCP/IP实际共分为4层&#xff0c;抓包信息中可以看到各层的数据&#xff0c;最上面的数据帧包含了所有数据。 附&#xff1a;抓取本地H…

专题四:设计模式总览

前面三篇我们通过从一些零散的例子&#xff0c;和简单应用来模糊的感受了下设计模式在编程中的智慧&#xff0c;从现在开始正式进入设计模式介绍&#xff0c;本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结&#xff0c;和描述具体意义。 设计模式体…

Docker-compose单机容器集群编排

传统的容器管理&#xff1a;Dockerfile文件 -> 手动执行 docker build 一个个镜像的构建 -> 手动执行 docker run 一个个容器的创建和启动 容器编排管理&#xff1a;Dockerfile文件 -> 在docker-compose.yml配置模板文件里定义容器启动参数和依赖关系 -> 执行dock…

PlantUML-UML 绘图工具安装、Graphviz安装、本地使用/在线使用、语法、图示案例

文章目录 前言本地安装vscode安装插件下载安装Graphviz配置Graphviz环境变量测试 在线使用演示PlantUML语法总结活动图&#xff08;新语法&#xff09;时序图类图用例图其他图 更多相关内容可查看 前言 本篇提供两种使用方式分别为 在线使用地址1&#xff1a;https://www.pla…

在安卓手机上原生运行docker

前言 之前的文章(香橙派5plus上跑云手机方案一 redroid(带硬件加速))在Ubuntu的docker里运行安卓&#xff0c;这里说下怎么在安卓手机下运行docker&#xff0c;测试也可以跑Ubuntu。 想在手机上运行docker想的不是一天两天了&#xff0c;其实很久之前就有这个想法了&#xff…

Docker网络模式和Cgroup资源限制

目录 1、Docker网络 &#xff08;1&#xff09;Docker网络实现原理 查看容器的输出和日志信息 2、Docker 的网络模式 查看docker列表 &#xff08;1&#xff09;网络模式详解 1&#xff09;host模式 2&#xff09;container模式 3&#xff09;none模式 4&#xff09;br…

SpringCloud教程 | 第十篇: 读取Nacos的配置

1、nacos服务器选用 2、test.yaml这一个DataId配置如下&#xff1a; config:name: aabb222 spring:application:name: testdatasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/hmblogs?useUni…