2012-06-27 48 views
9

在Java中使用SAX api解析沒有根元素的XML輸入列表是否可行?從流輸入中解析沒有根元素的XML片段列表

我試圖分析這種XML,但有一個

org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed. 

之前甚至調用endDocument事件被觸發。

我不想用明顯但笨拙的解決方案解決「預先追加自定義根元素或使用緩衝片段解析」。

我正在使用Java 1.6的標準SAX API。如果有人想知道SAX工廠已經設置了驗證(假)。

+0

重複http://stackoverflow.com/questions/3232110/parse-file-containing-xml-fragments-in-java。 –

+0

您可以參考[解析「根元素之後的文檔中的標記必須格式良好」例外](http://opensourceforgeeks.blogspot.in/2015/01/resolving-markup-in-document-following.html ) –

回答

14

首先,也是最重要的是,您正在解析的內容不是XML文檔。 從XML Specification

[定義:有恰好一個要素,稱爲根,或文檔元素,沒有其中部分出現在任何其它元素的內容]

現在,用SAX解析這一點 - 儘管你說,大約笨拙 - 我建議以下方法:

Enumeration<InputStream> streams = Collections.enumeration(
    Arrays.asList(new InputStream[] { 
     new ByteArrayInputStream("<root>".getBytes()), 
     yourXmlLikeStream, 
     new ByteArrayInputStream("</root>".getBytes()), 
    })); 

SequenceInputStream seqStream = new SequenceInputStream(streams); 

// Now pass the `seqStream` into the SAX parser. 

使用SequenceInputStream是將多個輸入流連接成單個流的便捷方式。它們將按照它們傳遞給構造函數的順序讀取(或者在這種情況下 - 由Enumeration返回)。

將它傳遞給你的SAX解析器,就完成了。

+0

同意 - 笨拙追加根元素的原因是因爲你正在處理笨拙的數據。否則,只要關閉任何您打開的第一個元素,SAX解析器就會認爲它已完成,因爲它已經完成了。我也是這樣做的,用於格式化的XML數據流 – Woody

+0

雖然你提供了一個我已經想到的答案,但是實現比我想象的更加優雅!謝謝您的回答。 – yannisf

+3

那麼,'SequenceInputStream'是那些久未遺忘的工具之一,儘管在Java 1.0以後,它們似乎沒有人知道。只是想提醒它仍然存在。 :) – npe