繁体   English   中英

通过DOM解析器编辑BIG XML

[英]Editing a BIG XML via DOM parser

如果有很大的XML,则使用DOM解析器进行解析。 现在需要从XML中添加/删除元素,即编辑XML如何编辑XML,因为由于内存限制而不会加载整个XML? 解决这个问题的策略是什么?

您可能会考虑使用SAX解析器,它不会将整个文档都保留在内存中。 它将更快,并且将使用更少的内存。

正如已经提到的其他两个答案一样,SAX解析器可以解决问题。 替代DOM的另一个方法是StAX解析器

传统上,XML API是:

  • 基于DOM-整个文档作为树结构读入内存,供调用应用程序随机访问
  • 基于事件-应用程序注册为在源文档中遇到实体时接收事件。

两者都有优势。 前者(例如DOM)允许随机访问文档,后者(例如SAX)需要较小的内存占用空间,并且通常要快得多。

可以将这两个访问隐喻视为相反的对立面。 基于树的API允许无限,随机的访问和操作,而基于事件的API是通过源文档进行的“一次性操作”。

StAX被设计为这两个对立面之间的中位数。 在StAX隐喻中,程序化入口点是一个光标,表示文档中的一个点。 应用程序将光标向前移动-根据需要从解析器中“拉出”信息。 这与基于事件的API(例如SAX)不同,后者将数据“推送”到应用程序-要求应用程序在必要时维护事件之间的状态以跟踪文档中的位置。

StAX是我处理大型文档的首选方法。 如果需要DOM,请查看支持懒惰地构造DOM节点的DOM实现(例如Xerces):

您对加载XML文档的内存约束的假设可能仅适用于DOM。 VTD-XML将整个XML加载到内存中,并高效地进行处理(是XML文档大小的1.3倍)...在内存和性能方面...

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf

现有的XML框架所不具备的另一个独特优势是其增量更新功能...

http://www.devx.com/xml/Article/36379

如stivlo所述,您可以使用SAX解析器来读取XML。

但是对于编写XML,您可以将其作为纯文本写入文件输出流。 我确信您将获得要求在新标签后的哪个标签或标签下插入新数据的要求。

暂无
暂无

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

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