[英]High performance XML parsing in C++
关于在C ++中解析XML等问题已经提出了很多问题......但是,我的问题非常具体,而不是一般问题。
我要求一个非常有效的C ++ XML解析器。 特别是我有一个非常非常大的XML文件来解析。 我的应用程序必须打开此文件并检索数据。 它还必须插入新节点并再次将最终结果保存在文件中。
为了做到这一点,我在开始时使用了rapidxml,但它要求我打开文件,解析所有内容(所有内容因为这个lib没有直接访问文件的功能而不先加载整个树),然后编辑树,修改它并通过覆盖它将最终树存储在文件上...它消耗了太多的资源。
是否有一个XML解析器,不需要我加载整个文件,但我可以用来快速插入新节点和检索数据? 你能指出我这个问题的解决方案吗?
您需要流式XML解析器而不是所谓的DOM解析器。
有两种类型的流解析器:拉和推。 pull解析器适用于快速编写将数据加载到程序存储器中的XML解析器。 推送解析器适用于编写程序以将一个文档转换为另一个文档(这是您要完成的任务)。 因此,我认为推送解析器最适合您的问题。
为了使用推送解析器,您需要编写本质上是用于解析事件的事件处理程序。 通过“解析事件”,我的意思是“达到开始标记”,“达到结束标记”,“找到文本”,“解析属性”等事件。
我建议您在阅读文档时,将转换后的文档写入单独的临时文件。 因此,需要编写XML解析事件处理程序,使它们具有状态,并逐步写出已翻译文档的XML。
C ++的三个优秀推送解析器库包括Expat , Xerces-C ++和libxml2 。
搜索“SAX解析器”。 它们大多是标记化器,即它们不依赖标记而不构建树。
我确信不存在允许您在不加载文件的情况下修改文件的XML库。 这根本不可能,因为文件不能以这种方式工作:您不能在文件中间插入(或删除)。 您只能覆盖相同大小的块,或者在末尾附加 。 但是您的请求需要在文件中间追加或删除。
只读取XML文件的一部分是可能的。 但写作 ......没办法。
如果你真的寻求高性能的XML流解析器,那么libhpxml对你来说可能是正确的。
尽可能使用模板库,如Boost :: property_tree或Boost :: XMLParser或POCO :: XML,Folly中包含XML Parser。
避免使用旧的C库,这是旧的代码设计。
有人说QtXML模块对于巨大的XML文件来说是高性能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.