2011-09-10 25 views
0

我試圖解析看起來像這樣一個永無止境的XML流:在解析完整個InputStream之前,我可以使SAXParser.parse()返回嗎?

<outer> 
    <foo>footext</foo> 
    <bar>bartext</bar> 
</outer> 
<outer> 
    <foo>footext</foo> 
    <bar>bartext</bar> 
</outer> 
<outer> 
    <foo>footext</foo> 
    <bar>bartext</bar> 
</outer> 
... 

我有我的SAXParser設置:

SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setValidating(true); 
SAXParser parser = factory.newSAXParser(); 

我可以用一個InputStream叫它我實現了DefaultHandler的很輕鬆地:

parser.parse(theInputStream, myHandler); 

的問題是,我需要parser.parse實際回報它碰到</outer>結束標記後,我可以返回解析出來的XML對象。這樣做的原因是,我的分析代碼(在一個名爲XMLParser的類)被稱爲在這樣的循環:

while(condition) { 
    Object o = xmlParser.getNextObject(); 
    ... do something with the object ... 
} 

是否有可能使從解析SAXParser的回報(的InputStream,DefaultHandler的)在其之前調用已閱讀完整的可用流?

回答

0

這個IBM article使用了拋出異常的技術。通常情況下,您不應該使用Exceptions來控制程序流程,但這可能是您最簡單的方式。

雖然我不推薦使用香草SAXException。創建一個像DataOfInterestFoundException這樣的子類並拋出它。然後,調用SAX解析的代碼可以捕獲這種類型的異常以正常停止,並將其他事件視爲真正的異常。

另一種解決方案可能是用自己的輸入流封裝輸入流,以某種方式說服SAX解析器停止。不知道你可以做到這一點。

+0

包裝流當被告知做到這一點時,可以關閉所有打開的標籤,並返回EOF。雖然我只是拋出你描述的異常。 – MeBigFatGuy

+0

我已經使用了從ContentHandler中拋出異常的技術,當它看到所有需要的數據時。當然,解析會中止 - 你不會看到更多的數據。請注意,有些解析器會從parse()方法中拋出原始異常,其他解析器會將其包裝爲自己的異常:您可能需要對不同的解析器進行一些嘗試,以找到一種可靠地將自己的異常與真實解析錯誤並在所有解析器中工作。 –

相關問題