ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

我应该在C中使用什么XML解析器?

2019-09-11 03:05:15  阅读:236  来源: 互联网

标签:c xml-parsing c-faq


我有需要解析的XML文档和/或我需要构建XML文档并将它们写入文本(文件或内存).由于C标准库没有此库,我应该使用什么?

注意:这是一个确定的,C -FAQ风格的问题.所以,是的,它与其他人重复.我不是简单地适应其他问题,因为他们倾向于要求更具体的东西.这个问题更通用.

解决方法:

就像标准库容器一样,您应该使用哪个库取决于您的需求.这是一个方便的流程图:

所以第一个问题是:你需要什么?

我需要完整的XML合规性

好的,所以你需要处理XML.不是玩具XML,真正的XML.您需要能够读取和写入所有XML规范,而不仅仅是低位,易于解析的位.您需要命名空间,DocTypes,实体替换,工作. W3C XML规范的全部内容.

接下来的问题是:您的API是否需要符合DOM或SAX?

我需要精确的DOM和/或SAX一致性

好的,所以你真的需要API是DOM和/或SAX.它不仅可以是SAX风格的推送解析器,也不能是DOM风格的保留解析器.它必须是实际的DOM或实际的SAX,在C允许的范围内.

你已经选择:

Xerces

那是你的选择.它几乎是唯一具有完整(或接近C允许)DOM和SAX一致性的C XML解析器/编写器.它还具有XInclude支持,XML Schema支持以及许多其他功能.

它没有真正的依赖.它使用Apache许可证.

我不关心DOM和/或SAX一致性

你已经选择:

LibXML2

LibXML2提供了一个C风格的界面(如果真的困扰你,请使用Xerces),尽管界面至少有点基于对象并且很容易包装.它提供了许多功能,例如XInclude支持(带回调以便你可以告诉它从哪里获取文件),XPath 1.0识别器,RelaxNG和Schematron支持(尽管错误信息有很多不足之处),以及等等.

它确实依赖于iconv,但可以在没有依赖性的情况下进行配置.虽然这确实意味着你可以解析一组更有限的可能的文本编码.

它使用MIT许可证.

我不需要完全符合XML

好的,所以完整的XML合规性对您来说无关紧要.您的XML文档完全在您的控制之下,或者保证使用XML的“基本子集”:没有名称空间,实体等.

那对你来说有什么关系?接下来的问题是:XML工作中最重要的是什么?

最大XML解析性能

您的应用程序需要采用XML并将其转换为C数据结构,因为这种转换可能会发生.

你已经选择:

RapidXML

这个XML解析器正如它所说的那样:快速的XML.它甚至不涉及将文件拉入内存;怎么回事取决于你.它处理的是将其解析为您可以访问的一系列C数据结构.它的执行速度与逐字节扫描文件的速度一样快.

当然,没有免费午餐这样的东西.与大多数不关心XML规范的XML解析器一样,Rapid XML不会触及名称空间,DocType,实体(字符实体和6个基本XML实例除外),等等.所以基本上是节点,元素,属性等.

此外,它是一个DOM风格的解析器.因此,它确实要求您阅读所有文本.但是,它不做的是复制任何文本(通常). RapidXML获得大部分速度的方式是通过就地引用字符串.这需要您进行更多内存管理(当RapidXML正在查看时,您必须保持该字符串处于活动状态).

RapidXML的DOM很简单.您可以获取事物的字符串值.您可以按名称搜索属性.就是这样.没有便利功能可以将属性转换为其他值(数字,日期等).你只是得到字符串.

RapidXML的另一个缺点是编写XML很痛苦.它要求您为字符串名称进行大量显式内存分配以构建其DOM.它确实提供了一种字符串缓冲区,但是仍需要大量明确的工作.它肯定是功能性的,但使用起来很痛苦.

它使用MIT许可证.它是一个只有头的库,没有依赖项.

>有一个RapidXML “GitHub patch”允许它也可以使用命名空间.

我关心性能但不是很多

是的,性能对您很重要.但也许你需要一些不那么简单的东西.也许某些东西可以处理更多的Unicode,或者不需要那么多用户控制的内存管理.性能仍然很重要,但你想要的东西不那么直接.

你已经选择:

PugiXML

从历史上看,这是RapidXML的灵感来源.但这两个项目有所不同,Pugi提供了更多功能,而RapidXML则完全专注于速度.

PugiXML提供Unicode转换支持,因此如果您有一些UTF-16文档并希望将它们读作UTF-8,Pugi将提供.如果你需要那种东西,它甚至还有一个XPath 1.0实现.

但Pugi仍然很快.与RapidXML一样,它没有依赖关系,并在MIT许可下分发.

阅读巨大的文件

您需要阅读以千兆字节为单位的文档.也许你是从stdin那里得到它们的,还有其他一些过程.或者你是从大量文件中读取它们.管他呢.关键是,您需要的是不必一次将整个文件读入内存以便处理它.

你已经选择:

libxml2的

Xerces的SAX风格的API将以这种方式工作,但LibXML2在这里是因为它更容易使用. SAX风格的API是一个push-API:它开始解析一个流,然后触发你必须捕获的事件.您被迫管理上下文,状态等.读取SAX风格API的代码比人们希望的更为分散.

LibXML2的xmlReader对象是一个pull-API.您要求转到下一个XML节点或元素;你没有被告知.这允许您根据需要存储上下文,以便在代码中比一堆回调更具可读性的方式处理不同的实体.

备择方案

Expat

Expat是一个着名的C解析器,它使用pull-parser API.它是由詹姆斯克拉克写的.

它的当前状态是活动的.最新版本是2.2.5,上个月发布(2017-10-31).

LlamaXML

它是StAX风格的API的实现.它是一个pull-parser,类似于LibXML2的xmlReader解析器.

但它自2005年以来一直没有更新.再次,Caveat Emptor.

XPath支持

XPath是一个用于查询XML树中元素的系统.使用标准化语法,通过公共属性有效地命名元素或元素集合是一种方便的方法.许多XML库都提供XPath支持.

这里有三种选择:

> LibXML2:它提供完整的XPath 1.0支持.同样,它是一个C API,所以如果这困扰你,还有其他选择.
> PugiXML:它还支持XPath 1.0.如上所述,它比LibXML2更像是一个C API,所以你可能会更熟悉它.
> TinyXML:它没有XPath支持,但有TinyXPath库提供它. TinyXML正在进行2.0版本的转换,这会显着改变API,因此TinyXPath可能无法使用新的API.与TinyXML本身一样,TinyXPath是在zLib许可下发布的.

刚刚完成工作

所以,你不关心XML的正确性.性能对您来说不是问题.流媒体无关紧要.你想要的只是将XML带入内存并允许你再次将它重新粘贴到磁盘上.你关心的是API.

您需要一个小型,易于安装,易于使用的XML解析器,并且小到足以与最终可执行文件的大小无关.

你已经选择:

TinyXML

我把TinyXML放在这个插槽中,因为它就像XML解析器一样简单易用.是的,它很慢,但它很简单明了.它具有许多用于转换属性等的便利功能.

在TinyXML中编写XML是没有问题的.你只需要新建一些对象,将它们连接在一起,将文档发送到std :: ostream,每个人都很高兴.

还有一些围绕TinyXML构建的生态系统,具有更加迭代器友好的API,甚至还有一个基于XPath 1.0的实现.

TinyXML使用zLib许可证,该许可证或多或少是具有不同名称的MIT许可证.

标签:c,xml-parsing,c-faq
来源: https://codeday.me/bug/20190911/1803445.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有