2010-06-18 152 views
1

一個簡單的任務:寫一個元素的兩個屬性:XMLOutputStream,修復名稱空間和屬性沒有命名空間

String nsURI = "http://example.com/"; 
XMLOutputFactory outF = XMLOutputFactory.newFactory(); 
outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); 
XMLStreamWriter out = outF.createXMLStreamWriter(System.out); 
out.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, "element", nsURI); 
out.writeAttribute("attribute", "value"); 
out.writeAttribute("attribute2", "value"); 
out.writeEndElement(); 
out.close(); 

Woodstox的回答是:

<element xmlns="http://example.com/" attribute="value" attribute2="value"></element> 

JDK 6回答:

<zdef-1905523464:element xmlns="" xmlns:zdef-1905523464="http://example.com/" attribute="value" attribute2="value"></zdef-1905523464:element> 

什麼?!

此外,如果我們添加前綴的元素:

out.writeStartElement("ns", "element", nsURI); 

JDK 6不再嘗試發出的xmlns = 「」:

<ns:element xmlns:ns="http://example.com/" attribute="value" attribute2="value"></ns:element> 

如果我們刪除一個屬性(即,僅有一個)沒關係。

我很確定這是JDK 6中的一個錯誤。我說得對嗎?任何人都可以提出一個解決方案,使圖書館(和其他人)都感到快樂嗎?如果我可以幫忙的話,我不想要求woodstox。

回答

2

我認爲你必須告訴XMLStreamWriter什麼是默認的命名空間,然後用它添加元素時:

String nsURI = "http://example.com/"; 
XMLOutputFactory outF = XMLOutputFactory.newFactory(); 
outF.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); 
XMLStreamWriter out = outF.createXMLStreamWriter(System.out); 
out.setDefaultNamespace(nsURI); 
out.writeStartElement(nsURI, "element"); 
out.writeAttribute("attribute", "value"); 
out.writeAttribute("attribute2", "value"); 
out.writeEndElement(); 
out.close(); 

上面的代碼給了我這樣的輸出:

<element xmlns="http://example.com/" 
    attribute="value" attribute2="value"></element> 

與Java版本「1.6.0_20」

+0

您之前是否得到過損壞的輸出?這並不能解決1.6.0_18中的問題。我剛剛下載的 – user205512 2010-06-18 12:21:10

+0

或1.6.0_20。 – user205512 2010-06-18 12:47:34

+0

是的,我得到使用您的原始代碼 – MarcoS 2010-06-18 12:50:26

1

我的建議是永遠不要依賴writeAttribute()的雙參數版本,因爲定義它應該輸出的內容不清楚:sh它應該使用命名空間「」(又名「無命名空間」)或任何當前的默認命名空間?這是特別令人困惑的,因爲按照XML規範,屬性從不使用默認名稱空間(只有明確的名稱空間)。所以可以說所有表達的行爲都可以被看作是正確的;但顯然他們不可能都是。這只是Stax API沒有正確定義(AFAIK)真正的答案應該是什麼(這很糟糕)。所以:只需指定屬性應該使用的名稱空間(「」或null都適用於「無名稱空間」),並且事情應該更好。

據我所知,JDK版本的問題在於,某些版本假定屬性確實使用了默認名稱空間;這就是爲什麼這個虛假的xmlns =「」'被添加。這是沒有必要的。

相關問題