Comment encoder des données arbitraires en XML avec Java 1.4 et SAX?
Question
Nous utilisons SAX pour analyser le code XML, car il n’est pas nécessaire de lire le document XML dans son intégralité pour pouvoir analyser une seule valeur. J'ai lu de nombreux articles qui insistaient sur le fait que SAX ne pouvait être utilisé que pour analyser / décoder du XML et non pour le créer. Est-ce vrai?
La solution
Non, ce n'est pas vrai, vous pouvez coder du XML en n'importe quel Writer en Java en utilisant quelque chose comme:
char[] ch;
AttributesImpl atts = new AttributesImpl();
Writer writer = new StringWriter();
StreamResult streamResult = new StreamResult(writer);
SAXTransformerFactory tf = (SAXTransformerFactory) TransformerFactory.newInstance();
// SAX2.0 ContentHandler
TransformerHandler transformerHandler = tf.newTransformerHandler();
Transformer serializer = transformerHandler.getTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// serializer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "nodes.dtd");
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
transformerHandler.setResult(streamResult);
transformerHandler.startDocument();
atts.clear();
// atts.addAttribute("", "", "xmlns", "CDATA", "http://www.example.com/nodes");
// atts.addAttribute("", "", "xmlns:xsi", "CDATA", "http://www.w3.org/2001/XMLSchema-instance");
// atts.addAttribute("", "", "xsi:schemaLocation", "CDATA", "/nodes.xsd");
transformerHandler.startElement("", "", "node_list", atts);
// displayName element
if (displayName != null) {
transformerHandler.startElement("", "", "display_name", null);
ch = displayName.toCharArray();
transformerHandler.characters(ch, 0, ch.length);
transformerHandler.endElement("", "", "display_name");
}
// nodes element
transformerHandler.startElement("", "", "nodes", null);
atts.clear();
atts.addAttribute("", "", "node_type", "CDATA", "sometype");
transformerHandler.startElement("", "", "node", atts);
ch = node.getValue().toCharArray();
transformerHandler.startElement("", "", "value", null);
transformerHandler.characters(ch, 0, ch.length);
transformerHandler.endElement("", "", "value");
transformerHandler.endElement("", "", "node");
transformerHandler.endElement("", "", "nodes");
transformerHandler.endElement("", "", "node_list");
transformerHandler.endDocument();
String xml = writer.toString();
Autres conseils
Les interfaces de gestionnaire SAX ont été conçues pour être faciles à mettre en œuvre. Il est facile d’écrire une classe avec une classe similaire (éventuellement en enveloppant une interface SAX) pour faciliter l’appel: chaînage d’appel, rappel de l’élément à fermer, attributs plus simples, etc.