Wir verwenden SAX zum Parsen von XML, da nicht das gesamte XML-Dokument in den Speicher gelesen werden muss, um einen einzelnen Wert zu analysieren. Ich habe viele Artikel gelesen, die darauf bestanden, dass SAX nur verwendet werden kann, um XML zu analysieren/zu dekodieren und nicht zu erstellen. Ist das wahr?Wie kann ich mit Java 1.4 und SAX beliebige Daten in XML codieren?
2
A
Antwort
4
Nein, ist es nicht wahr, Sie XML ein Writer in Java unter Verwendung von etwas ähnlichem kodieren:
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
Die SAX-Handler-Schnittstellen wurden entwickelt, um einfach zu implementieren zu sein. Es ist einfach, eine Klasse mit ähnlichen Wörtern zu schreiben (vielleicht um eine SAX-Schnittstelle zu wickeln), um das Aufrufen zu erleichtern - Verkettung, Erinnerung an das zu schließende Element, einfachere Attribute usw.
Baut das gesamte Dokument im Speicher auf der Verwendung des XSLT-Prozessors? –
Ich weiß, es ist ein altes Thema, aber dieser Code funktioniert nicht vollständig. Jemand könnte in Zukunft zu dieser Lösung kommen und versuchen, den obigen Code auszuführen. –