2008-10-01 118 views
4

輸出CDATA節這是How to encode characters from Oracle to Xml?如何從薩克斯XmlHandler

一個後續問題在我這裏的環境我使用Java序列化結果設置爲XML。我無法訪問輸出流本身,只能訪問org.xml.sax.ContentHandler。

當我嘗試在CDATA部分輸出的字符:

這種事基本上是這樣的:

xmlHandler.startElement(uri, lname, "column", attributes); 
String chars = "<![CDATA["+rs.getString(i)+"]]>"; 
xmlHandler.characters(chars.toCharArray(), 0, chars.length()); 
xmlHandler.endElement(uri, lname, "column"); 

我得到這個:

<column>&lt;![CDATA[33665]]&gt;</column> 

但我想這一點:

<column><![CDATA[33665]]></column> 

那麼我怎樣才能用Sax ContentHandler輸出一個CDATA部分?

回答

5

它正在越獄,因爲handler.characters函數設計用於轉義,並且<![CDATA[部分不被視爲值的一部分。

您需要使用新暴露的方法DefaultHandler2或使用TransformerHandler的方法,你可以設置輸出鍵CDATA_SECTION_ELEMENTS,這需要應該輸出子文節包含在CDATA標籤名稱的空格分隔列表。

StreamResult streamResult = new StreamResult(out); 
SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); 
TransformerHandler hd = tf.newTransformerHandler(); 
Transformer serializer = hd.getTransformer(); 
serializer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, "column"); 
hd.setResult(streamResult); 
hd.startDocument(); 
hd.startElement("","","column",atts); 
hd.characters(asdf,0, asdf.length()); 
hd.endElement("","","column"); 
hd.endDocument(); 
+0

感謝輸入。我會仔細看看的。 – 2008-10-01 13:53:59

3

您應該使用startCDATA()endCData()作爲分隔符,即

xmlHandler.startElement(uri, lname, "column", attributes); 
xmlHandler.startCDATA(); 
String chars = rs.getString(i); 
xmlHandler.characters(chars.toCharArray(), 0, chars.length()); 
xmlHandler.endCDATA(); 
xmlHandler.endElement(uri, lname, "column");