Comment sortir une section CDATA d'un Sax XmlHandler
Question
Ceci est une question complémentaire de Comment encoder des caractères Oracle XML?
Dans mon environnement, j’utilise Java pour sérialiser le jeu de résultats au format XML. Je n'ai pas accès au flux de sortie lui-même, mais uniquement à un org.xml.sax.ContentHandler.
Lorsque j'essaie de générer des caractères dans une section CDATA:
Cela se passe essentiellement comme ceci:
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = "<![CDATA["+rs.getString(i)+"]]>";
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");
Je reçois ceci:
<column><![CDATA[33665]]></column>
Mais je veux ceci:
<column><![CDATA[33665]]></column>
Alors, comment puis-je sortir une section CDATA avec un Sax ContentHandler?
La solution
Il est échappé car la fonction handler.characters est conçue pour s'échapper et la <![CDATA[
partie n'est pas considérée comme faisant partie de la valeur.
Vous devez utiliser les méthodes nouvellement exposées dans DefaultHandler2
ou utiliser l'approche TransformerHandler
où vous pouvez définir la clé de sortie CDATA_SECTION_ELEMENTS
, qui prend une liste délimitée par des espaces de noms de balises qui doivent générer des sous-sections de texte incluses dans 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();
Autres conseils
Vous devez utiliser startCDATA()
et endCData()
comme délimiteurs, c'est-à-dire.
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");