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 erheblichem Ressourcenverbrauch verbunden.

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. Wir sehen hier das Beispiel einer "DocumentBuilderFactory", die ein "DocumentBuilder" erzeugt, und dieser wiederum das "Document", das wiederum 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äßt. 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 wir direkten Zugriff auf diverse Nodetypen.


 public static void DOMDemo(String filename) {
  System.out.println("\nDOM\n");
  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 / 5. Dezember 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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