2008-08-14 43 views
5

我正在嘗試讀取XML文件,進行一些較小的更改(更改某些屬性的值),並將其重新寫回。使用StAX對XML文檔進行小的修改

我打算使用StAX解析器(javax.xml.stream.XMLStreamReader)來讀取每個事件,看看它是否是我想更改的,然後直接傳遞給StAX編寫器(javax.xml.stream.XMLStreamReader)(如果不需要進行更改)。

不幸的是,這看起來並不那麼簡單 - 作者沒有辦法採取事件類型和解析器對象,只有像writeAttributewriteStartElement這樣的方法。很明顯,我可以寫一個大的switch語句,用一個可能出現在XML文檔中的每種可能類型的元素的情況,然後再將它寫回去,但是對於看起來應該很簡單的東西來說,這看起來很麻煩。

有沒有我錯過的東西,可以很容易地寫出一個非常類似的XML文檔到您使用StAX讀取的文檔?

回答

2

StAX工作得很好,速度非常快。我在一個項目中使用它來解析高達20MB的XML文件。我沒有深入分析,但肯定比SAX更快。

至於你的問題:流和事件處理的區別,AFAIK是控制。藉助流媒體API,您可以逐步瀏覽文檔並獲取所需的內容。鑑於基於事件的API,您只能處理您感興趣的內容。

3

經過一番搗亂之後,答案似乎是使用事件讀取器/寫入器版本而不是Stream版本。

(即javax.xml.stream.XMLEventReader和javax.xml.stream.XMLEventWriter)

又見http://www.devx.com/tips/Tip/37795,這是什麼終於讓我感動。

2

我知道這是一個相當古老的問題,但如果其他人正在尋找類似的東西,還有另一種選擇:Woodstox Stax2擴展API有方法:

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

它使用流編寫器從流讀取器複製當前指向的事件。這不僅簡單而且非常有效。我用它進行了類似的修改,並取得了成功。

(如何獲得XMLStreamWriter2等所有Woodstox提供的情況下實現擴展版本 - 再加上有萬一有人想用「基本」斯塔克斯變種包裝,以及)