通过DOM解析器编辑BIG XML

问题描述:

如果有非常大的XML和DOM解析器用于解析它。 现在需要添加/删除XML中的元素,即编辑XML 如何编辑XML,因为整个XML由于内存限制而不会被加载? 解决这个问题的策略是什么?通过DOM解析器编辑BIG XML

+0

的要求是,SAX解析器不使用 – JavaGreenhorn

+1

为什么会出现这样的要求?你可以使用StAX解析器吗? –

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

正如stivlo提到的,您可以使用SAX解析器来读取XML。

但是,对于写入XML,您可以以纯文本形式写入文件输出流。我相信你会得到在哪个标签之后或者在哪个标签下应该插入新数据的要求。

+0

@MattBall伟大的人,你给-1为给我工作的想法。更多的是我不知道在这里贴出答案的人。如果你这样做,我想人们不会有建设性的想法。 –

由于已经提到了另外两个答案,一个SAX解析器将会执行这个技巧。您的另一种DOM替代品是StAX parser

传统上,XML的API或者是:

  • 基于DOM - 将整个文件读入内存为
  • 基于事件的树 结构,它通过调用应用程序随机存取 - 应用寄存器在源文档中遇到实体时接收事件为 。

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

这两个访问隐喻可以被认为是极性对立面。 A基于树的API允许无限制的随机访问和操纵,而基于事件的API 是通过源文档的“一次性”传递。

StAX被设计为这两个对立面之间的中位数。在StAX 隐喻中,编程入口点是代表文档中的 点的光标。应用程序将光标向前移动 - 根据需要从分析器中'拉'信息。这是 不同于基于事件的API--比如SAX--它将'数据' '推送到应用程序 - 要求应用程序在事件之间保持状态 以根据需要跟踪 文档中的位置。

StAX是我处理大型文档的首选方法。如果DOM是一个要求,请DOM实现类似的Xerces支持DOM节点懒的建筑:

XOM是DOM风格的解析器具有流API。我多次使用过XOM,但我没有使用流式传输功能,可能需要检查一下。

您对内存限制的假设加载XML文档可能只适用于DOM。 VTD-XML加载到内存整个XML,并有效地做它(1.3倍的XML文档的大小)......无论是在内存和性能...

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

的另一个显着优点,它莫属存在XML框架,是它的增量更新能力......

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