如果有一个非常大的XML和DOM解析器用于解析它。 现在需要从XML添加/删除元素,即编辑XML 如何编辑XML,因为内存限制不会加载整个XML? 有什么可以解决这个问题的策略?
答案 0 :(得分:2)
您可以考虑使用SAX解析器,而不是将整个文档保留在内存中。它会更快,也会使用更少的内存。
答案 1 :(得分:2)
正如另外提到的其他两个答案一样,SAX解析器可以解决这个问题。您对DOM的另一种选择是StAX parser。
传统上,XML API是:
- 基于DOM - 整个文档作为树读入内存 调用应用程序随机访问的结构
- 基于事件 - 应用程序注册以接收事件为 在源文档中遇到实体。
两者都有优势;前者(例如,DOM)允许随机 访问文档,后者(例如SAX)需要一个小内存 足迹并且通常要快得多。
这两种访问隐喻可以被认为是极端对立。一个 基于树的API允许无限制,随机访问和操纵,同时 基于事件的API是源文档中的“一次性”传递。
StAX被设计为这两个对立面之间的中位数。在StAX中 隐喻,程序化入口点是表示一个的游标 在文件中指出。应用程序向前移动光标 - 根据需要从解析器中“提取”信息。这是 不同于基于事件的API - 例如SAX - 它“推送”数据 应用程序 - 要求应用程序维护状态 事件之间必要的跟踪位置内的事件 文档。
答案 2 :(得分:1)
StAX是我处理大型文档的首选方法。如果DOM是一个要求,请检查支持懒惰构造DOM节点的Xerces之类的DOM实现:
答案 3 :(得分:0)
加载XML文档的内存约束假设可能仅适用于DOM。 VTD-XML将整个XML加载到内存中,并且有效地(XML文档大小的1.3倍)......在内存和性能方面......
http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf
其他XML框架存在的另一个显着优点是其增量更新功能......
答案 4 :(得分:-1)
正如stivlo所提到的,你可以使用SAX解析器来读取XML。
但是对于编写XML,您可以将其作为纯文本写入fileoutput流。我相信你会得到要求,提到应该在哪个标签之后或在哪个标签下插入新数据。