XML als Datenaustauschformat / Java: DOM-Programmierung

Java: DOM-Programmierung

Java: DOM-Programmierung

➪ DOM ist in der Lage, ein XML-Dokument im Arbeitsspeicher zu generieren bzw. ein vorhandenes Dokument zu laden und komplett zu verändern: neue Nodes einfügen, vorhandene löschen, verändern oder verschieben. Nach getaner Arbeit kann das Resultat z.B. in eine Datei geschrieben werden. Dieses Verfahren ist mit beträchtlichem Ressourcenverbrauch verbunden.

Auf dieser Seite:

XML generieren mit Java: org.w3c.dom.DOM

Für den Java-Einsteiger mag die reine DOM-Programmierung in Java etwas gewöhnungsbedürftig anmuten, nicht zuletzt wegen der Konstruktion von ObjectFactories, die erst anderer ObjectFactories bedürfen, um ihrerseits aktiv werden zu können. Sie sehen hier das Beispiel einer DocumentBuilderFactory, die ein DocumentBuilder erzeugt, und dieser wiederum das Document, das als ObjectFactory für andere Nodetypen dient.

Für das Abspeichern des so generierten DOM-Baums in eine Datei steht wiederum eine javax.xml.transform.TransformerFactory zur Verfügung, deren Ergebnis sich mittels javax.xml.transform.OutputKeys modifizieren lässt. Die endgültige Transformation des DOM-Baums in eine XML-Datei geschieht mit einem javax.xml.transform.dom.DOMSource und einem javax.xml.transform.stream.StreamResult.


 public static void createXML_DOM(){
  javax.xml.parsers.DocumentBuilderFactory dbf;  
  javax.xml.parsers.DocumentBuilder db;
  org.w3c.dom.Document doc;  
  org.w3c.dom.Element e, ei, de;
  org.w3c.dom.NodeList list;
  org.w3c.dom.Node n;
  java.io.File f;
  org.w3c.dom.Text tn; 
  javax.xml.transform.Transformer transformer;   
  try {
   dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();
   db = dbf.newDocumentBuilder();
   doc = db.newDocument();   
   e = doc.createElement("ROOT");   
   doc.appendChild(e);
   for(int i=1; i<10; i++)
   {
    ei = doc.createElement("Zahl");
    tn = doc.createTextNode(Integer.toString(i));
    ei.appendChild(tn);
    e.appendChild(ei);
   }    
   de = doc.getDocumentElement();
   list = de.getChildNodes();
   for(int i=0; i < list.getLength(); i++){
    n = list.item(i);    
    System.out.println(n.getNodeName() 
            + ": " + n.getTextContent());
   }
   f = new  java.io.File("C:/wg/DOMgenerated.xml");
   transformer = TransformerFactory.newInstance().newTransformer();
   transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
   transformer.setOutputProperty(OutputKeys.INDENT, "yes");
   transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
   transformer.transform(
      new javax.xml.transform.dom.DOMSource(doc), 
      new javax.xml.transform.stream.StreamResult(f));
  } catch (DOMException e1) {
  } catch (TransformerConfigurationException e1) {
  } catch (IllegalArgumentException e1) {
  } catch (ParserConfigurationException e1) {
  } catch (TransformerFactoryConfigurationError e1) {
  } catch (TransformerException e1) {
  } 
 }

Das Resultat:


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ROOT>
<Zahl>1</Zahl>
<Zahl>2</Zahl>
<Zahl>3</Zahl>
<Zahl>4</Zahl>
<Zahl>5</Zahl>
<Zahl>6</Zahl>
<Zahl>7</Zahl>
<Zahl>8</Zahl>
<Zahl>9</Zahl>
</ROOT>

Java: XML mit org.w3c.dom.Document auswerten

Neben diversen anderen Verfahren (z.B. Auswertung mit SAX oder JAXB) gibt es die Möglichkeit, XML mit org.w3c.dom.Document direkt auszuwerten. Hier haben Sie direkten Zugriff auf diverse Nodetypen.


 public static void DOMDemo(String filename) {
  try {
   File file = new File(filename);
   DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   DocumentBuilder db = dbf.newDocumentBuilder();
   org.w3c.dom.Document doc = db.parse(file);
   doc.getDocumentElement().normalize();
   System.out.println("Root element :" 
     + doc.getDocumentElement().getNodeName());
   NodeList nodeLst = doc.getElementsByTagName("Mensch");
   System.out.println("Information: alle Mensch-Elemente ");
   for (int s = 0; s < nodeLst.getLength(); s++) {
    Node nMensch = nodeLst.item(s);
    if (nMensch.getNodeType() == Node.ELEMENT_NODE) {
     System.out.println(nMensch.getNodeName());
     NodeList nlistMensch = nMensch.getChildNodes();
     for (int mi = 0; mi < nlistMensch.getLength(); mi++) {
      Node ni = nlistMensch.item(mi);
      if (!ni.getNodeName().equals("Kauf") 
         && ni.getNodeType() == Node.ELEMENT_NODE) {
       System.out.println(ni.getNodeName() + "\t->" 
         + ni.getChildNodes().item(0).getNodeValue());
      }
     }
    }
   }
  } catch (DOMException e) { e.printStackTrace();
  } catch (ParserConfigurationException e) { e.printStackTrace();
  } catch (SAXException e) { e.printStackTrace();
  } catch (IOException e) { e.printStackTrace();
  }
 }

wg / 3. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/DOM.html