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>&lt;![CDATA[33665]]&gt;</column>

Mais je veux ceci:

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

Alors, comment puis-je sortir une section CDATA avec un Sax ContentHandler?

Était-ce utile?

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");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top