【问题标题】:How to output a CDATA section from a Sax XmlHandler如何从 Sax XmlHandler 输出 CDATA 部分
【发布时间】:2008-10-01 09:00:23
【问题描述】:

这是How to encode characters from Oracle to 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 部分?

【问题讨论】:

    标签: java xml sax


    【解决方案1】:

    它被转义了,因为 handler.characters 函数被设计为转义,&lt;![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();
    

    【讨论】:

    • “... DefaultHandler2 使用TransformerHandler”是什么意思,当我序列化XML时如何使用DefaultHandler2方法输出CData标签。我已经在我的代码中使用了函数document.createCDATASection(...)。有什么方法可以在不使用CDATA_SECTION_ELEMENTS 属性的情况下输出 CDATA 标记?
    【解决方案2】:

    您应该使用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");
    

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 1970-01-01
      • 2014-01-07
      • 2016-06-16
      • 2010-09-15
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      相关资源
      最近更新 更多