2011-09-25 96 views
2

如果有非常大的XML和DOM解析器用於解析它。 現在需要添加/刪除XML中的元素,即編輯XML 如何編輯XML,因爲整個XML由於內存限制而不會被加載? 解決這個問題的策略是什麼?通過DOM解析器編輯BIG XML

+0

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

+1

爲什麼會出現這樣的要求?你可以使用StAX解析器嗎? –

回答

2

您可能會考慮使用SAX解析器,它不會將整個文檔保留在內存中。它會更快,也會使用更少的內存。

-1

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

但是,對於寫入XML,您可以以純文本形式寫入文件輸出流。我相信你會得到在哪個標籤之後或者在哪個標籤下應該插入新數據的要求。

+0

@MattBall偉大的人,你給-1爲給我工作的想法。更多的是我不知道在這裏貼出答案的人。如果你這樣做,我想人們不會有建設性的想法。 –

2

由於已經提到了另外兩個答案,一個SAX解析器將會執行這個技巧。您的另一種DOM替代品是StAX parser

傳統上,XML的API或者是:

  • 基於DOM - 將整個文件讀入內存爲
  • 基於事件的樹 結構,它通過調用應用程序隨機存取 - 應用寄存器在源文檔中遇到實體時接收事件爲 。

兩者都有優勢;前者(例如DOM)允許隨機訪問該文檔,後者(例如SAX)需要較小的內存,並且通常要快得多。

這兩個訪問隱喻可以被認爲是極性對立面。 A基於樹的API允許無限制的隨機訪問和操縱,而基於事件的API 是通過源文檔的「一次性」傳遞。

StAX被設計爲這兩個對立面之間的中位數。在StAX 隱喻中,編程入口點是代表文檔中的 點的光標。應用程序將光標向前移動 - 根據需要從分析器中'拉'信息。這是 不同於基於事件的API--比如SAX--它將'數據' '推送到應用程序 - 要求應用程序在事件之間保持狀態 以根據需要跟蹤 文檔中的位置。

0

XOM是DOM風格的解析器具有流API。我多次使用過XOM,但我沒有使用流式傳輸功能,可能需要檢查一下。