如何使用Java解析大型XML文件?

问题描述:

我想解析一个使用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

查看JDOM XML解析库。它远在原生Java解析器的前方,在我看来,它非常出色。

对于您提供的代码,您实际上必须遍历DOM树并检索元素。有关使用XML文档的更多信息,请参见hereofficial Java tutorial on working with XML

+0

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

对于大型文件(虽然我不会称你的大),我会用StAX

您可能想看看Woodstox这样的StAX implementation。它允许您从解析器中提取元素,而不是解析器将数据推送到应用程序,并让您暂停解析。

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

不要将文件读入String/StringReader和所有爵士乐。通过db.parse(new FileInputStream(...)).直接解析文件将文件读入内存只会浪费内存和时间。