2013-06-05 53 views
1

我嘗試使用Saxon代替JDK對XML轉換和Xpath的默認實現(我猜Xalan)。在我的代碼中,我使用document.createCDATASection(data)方法創建CDATA節點。代碼看起來如下給出:使用Saxon創建文檔createCDATASection方法的奇怪行爲(Maven Saxon -HE artifact 9.4)

CDATASection cdata = doc.createCDATASection("data"); 
    Node valueNode = node.appendChild(doc.createElement("value")); 
    valueNode.appendChild(cdata); 

其中節點是我的XML中的一些隨機節點。 它工作正常使用JDK的默認實現和生成的XML看起來像:

  <node> 
      <value><![CDATA[data]]></value> 
      </node> 

相同的代碼開始表現奇怪,如果我包括撒克遜Maven構件(請注意,這只是包容和工廠選擇/實例是默認的,因爲它前面是)和所有CDATA節點被視爲簡單的文本節點,即XML變爲:

  <node> 
      <value>data</value> 
      </node> 

其上檢索導致問題作爲代碼專門檢查其在後一種情況下已被刪除CDATA元件。我不知道爲什麼會發生這種情況(看起來像我沒有正確使用它)。我也嘗試從我的POM(Saxon的傳遞依賴)中排除Xerces工件,但沒有運氣。此外,還驗證了JDK本身正在使用DocumentBuilderFactory等的實現類。如果我做錯了事,請專家幫助我。

在此先感謝。

回答

1

我想你的應用程序可能會做一個從DOMSource到StreamResult的JAXP標識轉換,以序列化DOM。 Saxon的JAXP標識轉換實現使用XSLT的序列化規則,這會導致刪除CDATA部分。這完全符合JAXP,即使它不是默認的JDK實現。

如果您依賴於JAXP標識轉換器的特定實現的行爲,那麼您不應該編寫您的應用程序來獲取恰好在類路徑中存在的任何實現;你應該實例化你想要的實現。

當然,如果調用身份轉換的代碼是你自己寫的並且不能輕易改變的東西,那麼這當然很難。在這種情況下,最好的方法是將系統屬性javax.xml.transform.TransformerFactory設置爲選擇Xalan,並且在其中要顯式調用Saxon,而不是依賴JAXP工廠搜索。

+0

謝謝邁克爾。用你的答案解決了問題。非常感謝。 – prashant