4

这是如何将字符从 Oracle 编码为 Xml 的后续问题?

在我的环境中,我使用 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 部分?

4

2 回答 2

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();
于 2008-10-01T13:36:44.873 回答
3

您应该使用startCDATA()andendCData()作为分隔符,即

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");
于 2010-08-29T08:26:31.100 回答