2008-10-01 110 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");