我正在用SAX解析器構建XML DOM文檔。我寫的方法來處理startCDATA
和endCDATA
方法,並在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都逃到>
和<
越少,這是其它工具沒有問題,但它是誰需要讀取該文件作爲人類的一個問題好。我確信「con:setting」標籤是正確的。那麼命名空間前綴可能有問題嗎?
另外this question表示無法省略CDATA_SECTION_ELEMENTS屬性,並且通常在不轉義數據的情況下序列化所有CDATA節點。這些信息是否正確?答案的作者是否還可能知道其他方法?
更新:看來我的代碼有錯誤。當使用document.createCDATASection()
功能,然後使用變壓器串行化代碼時,即使不使用變壓器中的CDATA_SECTION_ELEMENTS
屬性,它也會輸出CDATA變量。
您不能使用運行XSLT樣式表的Transformer保存CDATA,也許規則對於無操作變換器(或更可能的結果將是處理器特定的)可能不同。 –
看來他們是因爲我現在在保存的XML文件中獲得了CDATA標籤。 – lanoxx
如果您在不同的'TransformerFactory'實現中獲得相同的行爲會很有趣 - 例如,如果切換到Saxon,那麼無操作的Transformer是否仍然保留CDATA?我無法在JAXP規範中看到任何以任何方式定義它的東西,但我知道,在所有情況下,DOM LS機制肯定會正常工作。 –