2011-06-12 205 views
2

我有一個文件,其中包含幾個如下所示的XML文檔。Java XML解析

<?xml version="1.0"?><Node>...<Node>...</Node>...</Node><?xml version... 

其中重複幾次。

我使用Java,我有一個FileChannel打開文件,我有一個字節緩衝區讀取。如果有內置的方式或者更簡單的方式或已經解決的方法來用Java對XML字節進行部分解析,將不勝感激。例如像這樣:

FooParser parser = new FooParser(); 

while (...) 
{ 
    buffer.flip(); 
    parser.parse(buffer); 
    buffer.compact(); 
    if (parser.done()) 
    { 
     xmlDocs.add(parser.xml()); 
     parser.reset(); 
    } 
    file.read(buffer); 
    ... 
} 

回答

2

沒有什麼的,我知道的,這將在一個單一的數據流分析多個XML文檔的API。我想你將不得不自己掃描<?xml ...標籤並分割輸入。解析器不會知道它在下一個xml文檔被讀取到標籤之前。此時它會窒息並且下一個xml文檔的開始標記已經被讀取。

實際上,現在你提到它了,你可能可以使用pull語法分析器來做你想做的事情。但我很確定api中的SAX和DOM解析器不會做你想做的。

+0

解析器應該能夠檢測到當前XML權限的結束?它爲什麼要讀取超過必需的內容,即超過當前的XML。 – foobarometer 2011-06-12 06:28:06

+0

解析器應該檢查文檔格式。一條規則是它有一個根標籤。解析器將繼續讀取直到它結束,或者直到遇到第二個根級標記並引發異常。此時,它將讀取第二個<?xml'標籤。 – 2011-06-12 06:31:56

+0

謝謝特德,我同意你的意見。這會違反良構規則,解析器需要驗證。如果有人有任何見解,我會留下一段時間的問題,謝謝! – foobarometer 2011-06-12 06:38:36

0

在XML文件開始時檢查<?序列是很常見的,因爲XML文件實際上必須以xml聲明開始(在文件中間不需要BOM)。所以我會看看編碼和拆分文件已經建議在每次發生<?和「xml」之後...

+0

實際上讀取整個文件可能不是我的選擇。所以我可能會使用文件通道一次編寫一個解析器來讀取幾個字節。謝謝! – foobarometer 2011-06-12 08:50:37

+0

當然,只是爲了分割文件,你不需要一次讀取整個文件。 – Clemens 2011-06-12 10:12:20

+0

儘管如此,這是一些工作,如果這些都是來自網絡的流,將會做什麼。不管怎樣,謝謝! – foobarometer 2011-06-12 10:25:17

1

我不得不這樣做,我已經回答(我)here與閱讀器子類包裝所有的更簡單的使用。