繁体   English   中英

C ++中的高性能XML解析

[英]High performance XML parsing in C++

关于在C ++中解析XML等问题已经提出了很多问题......但是,我的问题非常具体,而不是一般问题。

我要求一个非常有效的C ++ XML解析器。 特别是我有一个非常非常大的XML文件来解析。 我的应用程序必须打开此文件并检索数据。 它还必须插入新节点并再次将最终结果保存在文件中。

为了做到这一点,我在开始时使用了rapidxml,但它要求我打开文件,解析所有内容(所有内容因为这个lib没有直接访问文件的功能而不先加载整个树),然后编辑树,修改它并通过覆盖它将最终树存储在文件上...它消耗了太多的资源。

是否有一个XML解析器,不需要我加载整个文件,但我可以用来快速插入新节点和检索数据? 你能指出我这个问题的解决方案吗?

您需要流式XML解析器而不是所谓的DOM解析器。

有两种类型的流解析器:拉和推。 pull解析器适用于快速编写将数据加载到程序存储器中的XML解析器。 推送解析器适用于编写程序以将一个文档转换为另一个文档(这是您要完成的任务)。 因此,我认为推送解析器最适合您的问题。

为了使用推送解析器,您需要编写本质上是用于解析事件的事件处理程序。 通过“解析事件”,我的意思是“达到开始标记”,“达到结束标记”,“找到文本”,“解析属性”等事件。

我建议您在阅读文档时,将转换后的文档写入单独的临时文件。 因此,需要编写XML解析事件处理程序,使它们具有状态,并逐步写出已翻译文档的XML。

C ++的三个优秀推送解析器库包括ExpatXerces-C ++libxml2

搜索“SAX解析器”。 它们大多是标记化器,即它们不依赖标记而不构建树。

SAX解析器比DOM解析器更快,因为DOM解析器在构建XML文档的内存表示之前将整个文件读入内存,而SAX解析器的行为类似于事件侦听器,并在文档读取时构建文档。 到这里来解释一下

正如您所提到的, Xerces是一个很好的C ++ SAX解析器。

我建议寻找将XML文档分解为较小的XML文档的方法,因为这似乎是您的问题的一部分。

我确信不存在允许您在不加载文件的情况下修改文件的XML库。 这根本不可能,因为文件不能以这种方式工作:您不能在文件中间插入(或删除)。 您只能覆盖相同大小的块,或者在末尾附加 但是您的请求需要在文件中间追加或删除。

只读取XML文件的一部分是可能的。 写作 ......没办法。

好吧,这是一个偏僻的轨道,我看着这个,但我自己并没有真正使用它,它被称为asmxml 这些男孩声称性能没有,缺点,你需要x86汇编程序。

如果你真的寻求高性能的XML流解析器,那么libhpxml对你来说可能是正确的。

尽可能使用模板库,如Boost :: property_tree或Boost :: XMLParser或POCO :: XML,Folly中包含XML Parser。

避免使用旧的C库,这是旧的代码设计。

有人说QtXML模块对于巨大的XML文件来说是高性能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM