2012-02-08 87 views
0

我想解析一個使用Java的XML文件。如何使用Java解析大型XML文件?

XML文件大小隻有256 kb。我正在使用DOM解析器來解析XML文件。我如何解析大型XML文件內容?

下面是分析文件內容的方法:

public Document parse_a_string(StringBuffer decodedFile) { 
    Document doc1 = null; 
    try { 
     DocumentBuilderFactory factory = 
       DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = factory.newDocumentBuilder(); 
     InputSource inStream = new InputSource(); 

     // problem here 
     inStream.setCharacterStream(new StringReader(decodedFile.toString())); 

     doc1 = db.parse(inStream); 
    } catch (Exception e) { 
    } 
    return doc1; 
} 

文件內容是在StringBuffer參考對象,decodedFile,但是當我將它設置爲StringReader它僅接受字符串。

+1

StringBuffer有一個toString()方法將其轉換爲String。在發佈這些問題之前先檢查JavaDoc – 2012-02-08 16:35:46

+0

是的,但DecodedFile大小大於字符串大小。所以我們需要使用stringbuffer。但在StringReader中只接受字符串對象。我的問題是我們如何解析存在於stringbuffer中的大內容。 – Mohan 2012-02-08 16:41:27

+0

解析它時是否收到任何錯誤,如OutOfMemory?這可能與更改Java內存設置一樣簡單。 – 2012-02-08 16:41:30

回答

2

查看JDOM XML解析庫。它遠在原生Java解析器的前方,在我看來,它非常出色。

對於您提供的代碼,您實際上必須遍歷DOM樹並檢索元素。有關使用XML文檔的更多信息,請參見hereofficial Java tutorial on working with XML

+0

如果問題只是解析256K文件,JDom是好的,以及Dom4J或Xom。 – 2012-02-08 17:20:32

5

對於大型文件(雖然我不會稱你的大),我會用StAX

2

您可能想看看Woodstox這樣的StAX implementation。它允許您從解析器中提取元素,而不是解析器將數據推送到應用程序,並讓您暫停解析。

3

256Kb是一個非常小的文件時下:昨天我正在使用一個45GB的文件,這是一個200,000大的因素!

目前尚不清楚你的問題是什麼。任何普通的Java解析技術都可以很好地工作。您使用哪一個取決於您解析文件的原因以及您想要對數據執行的操作。

話雖如此,許多人似乎默認選擇DOM,因爲它是如此根深蒂固。但是,更現代的對象模型(如JDOMXOM)更容易處理。

+0

你能告訴我你是怎麼解析這個45Gb文件的,實際上我需要解析一個大小爲40-50GB的XML文件給TSV或CSV,請問我該如何解決這個問題。 – dpsdce 2012-02-23 10:38:28

+0

我在Saxon-EE中使用流媒體設施,記錄在http://www.saxonica.com/documentation/sourcedocs/streaming.xml – 2012-05-24 07:30:18

0

不要將文件讀入String/StringReader和所有爵士樂。通過db.parse(new FileInputStream(...)).直接解析文件將文件讀入內存只會浪費內存和時間。