Nous utilisons SAX pour analyser XML car il ne nécessite pas que le document XML entier soit lu en mémoire afin d'analyser une seule valeur. J'ai lu beaucoup d'articles qui insistaient sur le fait que SAX ne peut être utilisé que pour analyser/décoder le XML et ne pas le créer. Est-ce vrai?Comment encoder des données arbitraires en XML en utilisant Java 1.4 et SAX?
2
A
Répondre
4
Non, ce n'est pas vrai, vous pouvez encoder XML à tout Writer en Java en utilisant quelque chose de similaire à:
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();
0
Les interfaces gestionnaire SAX ont été conçus pour être faciles à appliquer. Il est facile d'écrire une classe similaire (peut-être en enveloppant une interface SAX) pour faciliter l'appel - chaînage, rappel de l'élément à fermer, attributs plus faciles, etc.
Est-ce que cela compile tout le document en mémoire? d'utiliser le processeur XSLT? –
Je sais que c'est un vieux sujet, mais ce code ne fonctionne pas complètement. Quelqu'un pourrait venir à cette solution à l'avenir et essayer d'exécuter le code ci-dessus. –