2012-08-24 18 views
4

我們有一個新的要求:有效的方式來讀取大的XML文件的一小部分在Java中

有一些大的XML文件不斷進入我們的系統,我們需要及時快速地處理它們使用Java 。該文件是巨大的,但我們處理所需的信息是在一個非常小的元素內。 ... ...

什麼是我們開始處理之前,從大文件中提取數據的這小部分的最佳方式。如果我們嘗試加載整個文件,我們會因大小而立即發生內存不足錯誤。 Java中有效的方法是什麼,我可以使用它來獲取..data ..data ..data ..數據元素,而不需要逐行加載或讀取文件。有沒有我可以用來完成這個任務的SAX解析器?

謝謝

回答

4

的SAX解析器是基於事件的,並且更快,因爲他們做你的需要:他們不完全讀取XML文檔。在Java發行版中有一個SAXParser

+0

一旦你找到你感興趣的部分,你會推薦什麼方法來停止解析?恕我直言,SAX使用的回調模型並不適用於此。 – Alex

+0

我必須同意這一點。仔細定義處理程序方法(高效且最簡單的代碼)也很重要,否則您最終可能會構建一個不如基於DOM的解決方案好得多的解決方案。 –

+2

我認爲XMLStreamReader(StAX)可能更適合這裏。既然它給了你一個迭代器,你可以循環直到你找到你要找的東西,讀取它,然後關閉閱讀器。 – Alex

2

那麼,如果你想讀取一個文件的一部分,你需要需要讀取文件的每一行,以便能夠識別感興趣的文件的部分,然後提取你所需要的。

如果您只需要輸入XML的一小部分,您可以使用SAX,或者如果您只需要讀取特定的元素或屬性,則可以使用XPath,這會更容易實現。

Java帶有一個內置的SAXParser實現以及一個XPath實現。查找SAXParser here和XPath here的javadoc。

+0

XPath會在內存中保留內存嗎? –

+2

鏈接到Java 5?在2012年? – Alex

+1

@MiserableVariable Java的內置XPath實現接受DOM元素(如Document,Node等)以及InputSource對象(由SAX支持)。所以這取決於你如何使用它。 –

2

StAX是基於蒸的數據,如SAX另一種選擇,而是通過「拉」你想要什麼,而不是它「推」給你一個更友好的方式(IMO)來處理數據的好處。

3

我不得不解析以前項目(1G-2G)中的大文件,並且不想處理使用SAX。在某些情況下,我發現SAX太低級,並且在大多數情況下,像keepings一樣是遍歷方法。

我已經使用了VTD庫http://vtd-xml.sourceforge.net/。這是一個極其快速的庫,它使用指針來瀏覽文檔。

相關問題