簡體   English   中英

將Java DOM文檔序列化為XML:添加CData元素

[英]Serializing Java DOM Document to XML: Add CData Elements

我正在使用SAX解析器構造XML DOM文檔。 我已經編寫了處理startCDATAendCDATA方法的方法,並在endCDATA方法中構造了一個新的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”標簽是正確的。 那么名稱空間前綴可能有問題嗎?

這個問題還表明,不可能省略CDATA_SECTION_ELEMENTS屬性,並且通常在不轉義數據的情況下序列化所有CDATA節點。 該信息是否正確,或者答案的作者可能還不知道其他方法?

更新:似乎我的代碼有誤。 當使用document.createCDATASection()函數,然后用序列化的輸出CDATA標簽變壓器的代碼,即使不使用的CDATA_SECTION_ELEMENTS在變壓器特性。

看起來您有一個支持名稱空間的DOM。 文檔說您需要提供元素的合格名稱表示

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的形式。

在這條線

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

嘗試將"con:setting"替換為"{http://con.namespace/}setting"

使用適當的名稱空間

您可以嘗試使用DOM原生的“加載和保存”機制 ,而不是使用no-op Transformer來序列化DOM樹,該機制應保留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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM