2012-02-08 75 views
3

我有一個用於接受命令並以XML格式發送結果的外部系統的套接字連接。每個命令和結果都是一個獨立的XML文檔。解析連續的XML文檔流

哪個Java解析器(/組合)我應該使用到:

  • 不斷解析流而不關閉連接(我知道這是愚蠢的,但我在過去嘗試過的DOMParser和它拋出一個異常時在流中遇到的另一個文檔根目錄是完全可以理解的)。我需要的東西如下:不斷讀取流,並在文檔完全收到時,處理它。我不知道文檔有多大,所以我需要離開解析器來找出文檔的末尾。
  • 反序列化每個傳入文檔到bean實例(與之相似像XStream的那樣)
  • 連載命令對象到輸出流從註釋的類實例(類似於像XStream的一樣)。我不想使用兩個單獨的庫進行發送和接收。
+1

看看[這](http://stackoverflow.com/questions/3302575)張貼,可能會回答你的問題。 – 2012-02-08 11:55:28

+0

可悲的是我不能使用它,因爲我沒有得到任何可以用來分隔文檔的處理頭。編碼始終是UTF-8,因此簡單地省略標題。 – NagyI 2012-02-08 12:13:35

回答

2

那麼... XStream.createObjectInputStream似乎是你需要的。我不確定提供的流是否必須將所有對象都包含在根節點中,但無論如何,您可以安排一個輸入流,以添加一些虛擬內容以適應XStream的需要。我會擴大這個答案後...

http://x-stream.github.io/objectstream.html有一些樣品...

根節點

事實上,讀者需要一個根節點。所以你需要一個輸入流,其末尾加上<object-stream>加上真實的字節內容,再加上</object-stream>(如果你介意這一點)。根據你所需要的(輸入流,讀者),實現可能會有些不同,但是可以完成。

樣品

可以使用的SequenceInputStream虛擬內容串聯到原來的InputStream:如果您使用的讀者......嗯

InputStream realOne = .. 
// beware of the encoding! 
InputStream root = new ByteArrayInputStream("<object-stream>".toBytes("UTF-8")); 
InputStream all = new SequenceInputStream(root, realOne); 

xstream.createObjectInputStream(withRoot); // voi lá 

。必須有東西等效:)

+0

值得一試。但我真的不喜歡爲此使用黑客入侵的解決方案。希望我不需要你在最後提到的僞造。 – NagyI 2012-02-08 12:08:22

+0

謝謝你的示例。我會試試:) – NagyI 2012-02-08 12:16:49

+0

那麼,如果發件人用一個根建立XML就沒有問題了。另一種方式可以是插入標記來指示不同的部分,以便您可以輕鬆找到結尾。 – helios 2012-02-08 12:17:34

0

你最好的選擇可能是SAX解析器。有了它,你可以實現ContentHandler文件,並在那裏,在endDocument方法中,做處理和準備下一個文件。看看這個頁面:http://docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html - 解釋和例子。

+0

SAX是一個基於事件的解析器。是否有任何解決方案可用於通過SAX反序列化對象?例如。 XStream不能將SAX用作閱讀器。 – NagyI 2012-02-08 12:10:43

+0

你應該能夠根據你的'InputStream'用'InputSource'初始化SAX解析器。看看這個頁面:http://www.ibm.com/developerworks/xml/library/x-tipsaxis/index。html – 2012-02-08 12:24:17

+0

如果要反序列化對象,則無論輸入XML的長度是多少,都將序列化後的對象保留在內存中。如果是這樣的話,你確定你不能像gasan建議那樣做(得到整個回答並解析它)?無論如何,你都將整條消息保存在內存中(儘管可能對象表示可能更小)。 – fpacifici 2012-02-10 15:40:54

0

我會說你讀了一個完整的完整答案,然後解析它。然後讀另一個。我認爲沒有必要不斷閱讀回覆。

+0

很遺憾,我不知道文檔將會存在多長時間(將此添加到該問題中,謝謝您提及它)。我必須將它留給解析器來確定XML文檔何時結束。 – NagyI 2012-02-08 12:06:40