2010-03-14 24 views
1

我有下面的代碼是如何工作的認識問題:如何防止一對XMLEvent [Reader | Writer]將空標籤分成start + end標籤?

XMLInputFactory xif = XMLInputFactory.newFactory(); 
XMLOutputFactory xof = XMLOutputFactory.newFactory(); 

XMLEventReader reader = xif.createXMLEventReader(/* ... */); 
XMLEventWriter writer = xof.createXMLEventWriter(/* ... */); 

writer.add(reader); 

的方法writer.add([讀者一些])讀取器中的所有事件,並將其寫入結果。可悲的是,發生以下情況:

輸入

<root><c/></root> 

被轉化爲

<root><c><c/></root> 

我知道,從XML角度看,這些都是平等的樹木,而不是一個人;)

我能做些什麼來獲得相同的輸出?

僅供參考:稍後我需要一個XMLEvent [Reader | Writer]對過濾「XML事件」。

回答

1

按照list of XMLEvents好像是沒有辦法使區別,它的確會產生StartElementEndElement事件。消費者需要針對StartElement緊接着是EndElement的情況進行優化。

這顯然不是工廠返回的XMLEventReader的情況。如果你想自己優化這種行爲,我看不出有什麼其他的辦法,而不是像做

  • 檢查有什麼用createXMLEventReader
  • 子類XMLEventReader實現返回來優化這種情況下
  • XMLInputFactory具體XMLEventReader實施並覆蓋createXMLEventReader以返回您的XMLEventReader子類的一個實例

如果這聽起來太複雜了(或者不是喔rk),我建議你去a solution使用XMLStreamWriter。這一個有一個專門的方法writeEmptyElement

(或者你可以試用一下我的home-made pretty printer,它是基於XMLStreamWriter

1

除非我弄錯了,Woodstox可以適當配置可以產生空標籤(默認),或沒有(所以它總是會輸出開始+結束標記,即使沒有內容)。 由於您可以對XMLStreamWriter進行配置,因此您可以使用該流編寫器生成XMLEventWriter,它應該按預期工作。

+0

_「除非我錯了」 - - 誰會知道更好!? ;-) – 2011-07-07 13:37:38

+0

:-) - 好的,沒錯,我很可能會在這個特定的事情上弄錯。 – StaxMan 2011-07-07 19:31:52