2012-03-26 33 views
2

「XML」不同的前綴創建序列化的XML如下:STAX的isRepairingNamespaces功能產生爲XML命名空間

XMLOutputFactory factory = XMLOutputFactory.newInstance(); 
factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); 

StringWriter buffer = new StringWriter(); 
XMLStreamWriter writer = factory.createXMLStreamWriter(buffer); 

writer.writeStartElement("doc"); 
writer.writeAttribute(javax.xml.XMLConstants.XML_NS_URI, "base", "/mydoc.xml"); 
writer.writeCharacters("Hello world"); 
writer.writeEndDocument(); 
writer.close(); 

// buffer now contains: 
// <doc xmlns:zdef101282835="http://www.w3.org/XML/1998/namespace" zdef101282835:base="/mydoc.xml">Hello world</doc> 

所以修復的命名空間功能已經產生比xmlhttp://www.w3.org/XML/1998/namespace命名空間的前綴。

如果不是因爲重新解析文檔時返回的錯誤,那我會很好。當我嘗試分析得到的文檔,我得到以下異常:

org.xml.sax.SAXParseException: The prefix "xml" cannot be bound to any namespace other than its usual namespace; neither can the namespace for "xml" be bound to any prefix other than "xml".

是否有可以XMLOutputFactory配置正確地做到這一點的方法嗎?

就在您告訴我使用包含prefix參數的writeAttribute方法之前,我在對象之間傳遞SAX事件,而不想知道它們是什麼。這就是爲什麼我希望編組人員能夠爲我處理名稱空間的原因......所以我不必爲特定情況下編寫一個給定名稱空間的前綴是預先確定的。鑑於xml命名空間甚至不必定義(甚至可能不應該如此),所以寫入IS_REPAIRING_NAMESPACES代碼庫將是一個簡單的例外,不是嗎?

感謝您的任何建議。

回答

0

作者將只修復未綁定到前綴的名稱空間。在實際編寫根元素之前添加

writer.setPrefix("xml", XMLConstants.XML_NS_URI); 

修復了問題。