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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top