2014-04-25 101 views
2

我正在用SAX解析器構建XML DOM文檔。我寫的方法來處理startCDATAendCDATA方法,並在endCDATA方法我建立一個新的CDATA節是這樣的:將Java DOM文檔序列化爲XML:添加CData元素

public void onEndCData() { 
    xmlStructure.cData = false; 
    Document document = xmlStructure.xmlResult.document; 
    Element element = (Element) xmlStructure.xmlResult.stack.peek(); 
    CDATASection section = document.createCDATASection(xmlStructure.stack.peek().characters); 
    element.appendChild(section); 
} 

當我序列化這對我使用下面的行來配置變壓器的XML文件:

transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "con:setting"); 

從來沒有<![CDATA[標記出現在我的XML文件,而不是所有backets都逃到&gt;&lt;越少,這是其它工具沒有問題,但它是誰需要讀取該文件作爲人類的一個問題好。我確信「con:setting」標籤是正確的。那麼命名空間前綴可能有問題嗎?

另外this question表示無法省略CDATA_SECTION_ELEMENTS屬性,並且通常在不轉義數據的情況下序列化所有CDATA節點。這些信息是否正確?答案的作者是否還可能知道其他方法?

更新:看來我的代碼有錯誤。當使用document.createCDATASection()功能,然後使用變壓器串行化代碼時,即使不使用變壓器中的CDATA_SECTION_ELEMENTS屬性,它也會輸出CDATA變量。

+0

您不能使用運行XSLT樣式表的Transformer保存CDATA,也許規則對於無操作變換器(或更可能的結果將是處理器特定的)可能不同。 –

+0

看來他們是因爲我現在在保存的XML文件中獲得了CDATA標籤。 – lanoxx

+0

如果您在不同的'TransformerFactory'實現中獲得相同的行爲會很有趣 - 例如,如果切換到Saxon,那麼無操作的Transformer是否仍然保留CDATA?我無法在JAXP規範中看到任何以任何方式定義它的東西,但我知道,在所有情況下,DOM LS機制肯定會正常工作。 –

回答

2

它看起來像你有一個名稱空間感知的DOM。該docs說,你需要提供元素的Qualified Name Representation

private static String qualifiedNameRepresentation(Element e) { 
    String ns = e.getNamespaceURI(); 
    String local = e.getLocalName(); 
    return (ns == null) ? local : '{' + ns + '}' + local; 
} 

所以屬性的值將是形式{http://your.conn.namespace}setting的。

1

在這一行

transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "con:setting"); 

嘗試使用適當的命名空間"{http://con.namespace/}setting"

更換"con:setting"

0

而不是使用一個空操作Transformer序列化的DOM樹,你可以嘗試使用DOM -native "load and save" mechanism,它應該保留DOM樹中的CDATASection節點,並將它們作爲CDATA節寫入生成的XML中。

DOMImplementationLS ls = (DOMImplementationLS)document.getImplementation(); 
LSOutput output = ls.createLSOutput(); 
LSSerializer ser = ls.createLSSerializer(); 
try (FileOutputStream outStream = new FileOutputStream(...)) { 
    output.setByteStream(outStream); 
    output.setEncoding("UTF-8"); 
    ser.write(document, output); 
}