Wie ein CDATA-Abschnitt zur Ausgabe von einem Sax XmlHandler
Frage
Dies ist eine Followup Frage von Wie Zeichen von Oracle kodieren xML?
In meiner Umgebung hier verwende ich Java um das Ergebnis zu xml gesetzt serialisiert. Ich habe keinen Zugriff auf den Ausgangsstrom selbst, nur auf eine org.xml.sax.ContentHandler.
Wenn ich versuche, die Ausgabe Zeichen in einem CDATA Abschnitt:
Es kommt im Grunde wie folgt:
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = "<![CDATA["+rs.getString(i)+"]]>";
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");
Ich bekomme diese:
<column><![CDATA[33665]]></column>
Aber ich will diese:
<column><![CDATA[33665]]></column>
Wie kann ich Ausgang einen CDATA-Abschnitt mit einem Sax Content?
Lösung
Es ist entkam immer, weil die handler.characters Funktion ausgelegt ist, zu entkommen und der <![CDATA[
Teil ist nicht Teil des Wertes berücksichtigt.
Sie müssen die neu freigelegten Methoden in DefaultHandler2
verwenden oder den TransformerHandler
Ansatz verwenden, in dem Sie die Ausgabeschlüssel CDATA_SECTION_ELEMENTS
gesetzt, die eine Leerzeichen getrennte Liste von Tag-Namen nimmt die Abschnitte Ausgabeunter Textes in CDATA eingeschlossen sollten.
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();
Andere Tipps
Sie sollten startCDATA()
und endCData()
als Trennzeichen verwenden, d.
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");