Gabi und Sascha
Tags - Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

Im aktuellen Javamagazin ist ein Artikel über die Neuerungen in JAXP 1.3, welches in Java 5.0 integriert ist. Der Artikel kommt zwar etwas spät, aber besser spät als nie. Leider findet sich in dem Artikel ein zumindest nicht ganz korrekte Aussage auf Seite 111:

Ein Manko des JAXP API war bisher, dass es keine Standardisierung zum Laden und Speichern von XML- bzw. DOM-Dokumenten gab. In J2SE 1.4 konnte man die klassischen Datei-Operationen verwenden (BufferedReader, BufferedWriter. Xerces besitzt mehrere Serializer-Klassen (XMLSerializer, XML11Serializer, HTMLSerializer, XHTMLSerializer), die in anderen XML-Parsern nicht zur Verfügung stehen. Bei einem Wechsel des Parsers muss der Java-Code angepasst werden.

Bedenklich an diesem Zitat ist die Tatsache, dass der Autor dabei schlicht ignoriert, dass es im J2SE 1.4 sehr wohl eine standardisierte API für das serialisieren von XML gibt. Dabei können sowohl DOM, SAX als auch beliebige Java Objektgraphen (natürlich mit ein wenig Handarbeit) in XML serialisiert werden. Wie das genau geht erklärt Benoît Marchal beispielsweise in seinem hilfreichen Artikel Tip: Using SAXTransformerFactory.

Ich finde es Schade, dass gerade in einem Fachblatt wie dem Javamagazin soetwas behauptet wird. Zwar ist die Aussage nicht ganz so schlimm, wie der völlig verunglückte Artikel zum Apache Commons Modeler, aber er lässt schon Zweifel an der Qualifikation des Autoren und der Qualitätssicherung zu.

Damit man die Aussagen auch einfach nachvollziehen kann, hier ein kleines Beispiel, welches ein XML Dokument einliesst (liegt als String vor) und in eine temporäre Datei, mittels der Transformer API, schreibt:


    /**
     * Simple example to write DOM to Files and Streams.
     *
     * @author Sascha Kohlmann
     */
    public class Java14XmlSerializerExample {

        private static final String XML = 
            "<test><value>Simple DOM2File test</value><name>I think this works fine."
            + "</name></test>";
    
        public static void main(final String [] args) throws Exception {

            // Vorbereitung für DOM.
            final Reader reader = new StringReader(XML);
            final InputSource source = new InputSource(reader);
            final DocumentBuilderFactory dFactory = 
                DocumentBuilderFactory.newInstance();
            final DocumentBuilder builder = dFactory.newDocumentBuilder();
            final Document doc = builder.parse(source);

            final DOMSource dSource = new DOMSource(doc);
        
            // Ausgabe in temporäre Datei vorbereiten.
            final File tmpFile = File.createTempFile("Java14XmlSerializerExample.", 
                                                     ".xml");
            System.out.println("write to: " + tmpFile.getAbsolutePath());
            final FileWriter fw = new FileWriter(tmpFile);
            final StreamResult sResult = new StreamResult(fw);

            // DOM in XML serialisieren.
            final TransformerFactory tFactory = TransformerFactory.newInstance();
            final Transformer transformer = tFactory.newTransformer();
        
            transformer.transform(dSource, sResult);
        
            System.out.println("written - please verify");
        }
    }

Das ganze sollte natürlich mit Java 1.4 ausprobiert werden.

Die JAXP ist übrigens auch ein heisser Kanditat für Abkürzungen in Abkürzungen:

  • JAXP
  • Java API for XML Parsing
  • Java Application Programming Interface for Extensible Markup Language Processing
Schlappe 80 Zeichen. Nicht schlecht :-)


Man kann SAXTransfomerFactory zum Serialisieren benutzen, allerdings geht das nur über den Umweg über einen XSLT-Prozessor. Die von mir im Artikel angesprochenene Interfaces aus org.w3c.dom bieten einen direkten Weg ohne XSLT-Prozessor. Dies vereinfacht vieles. Dies ist sicherlich nicht deutlich geworden, denn das meinte ich auch damit, das es bisher keine Klassen für den direkten Weg zum Serialisieren gab. Den Umweg über SAXTransfomerFactory empfand ich immer als Krücke (zweifelsohne ist es ein gangbarer Weg), der sich jetzt mit DOM Level 3 LS meiner Meinung nach wesentlich verbessert hat. Ich denke, das dies den Beitrag nicht schlecht oder gar fehlerhaft macht. Es ist in einem derartigen Überblicksartikel leider nicht möglich, sämtliche Aspekte zu berücksichtigen und zu erwähnen. Manch einer freut sich sicherlich auch über die Interfaces DOMLocator und DOMStringList, auf die ich in dem Beitrag auch nicht weiter eingehen konnte.