home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

XML-Verarbeitung mit JaxP

Inzwischen bietet Java mit Bordmitteln eine elegante Art, XML-Dokumente zu erzeugen und zu bearbeiten. Auch die Serialisierung und Deserialisierung ist mit wenigen Zeilen Programmcode zu erreichen. Beachten Sie in diesem Kontext auch JaxB.

package xmlJaxP;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;

public class StartJaxP {
  private static String text = "<HTWG><student id=\"2\">Carla</student><student id=\"3\">Carl</student></HTWG>";
  
  public static void main(String[] args) {
    try {
      //1. Generate XML from String or from File
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();
      Document dom = db.parse(new InputSource(new StringReader(text)));
      //oder aus Datei: Document dom = db.parse("employees.xml");
      
      //2. Get Elements
      Element root = dom.getDocumentElement();
      NodeList students = root.getElementsByTagName("student");
      if(students != null && students.getLength() 0) {
        for(int i = ; i < students.getLength();i++) {
          Element student = (Element)students.item(i);
          String id = student.getAttribute("id");
          String name = student.getTextContent()//alternativ: student.getFirstChild().getNodeValue();
          System.out.println("Der Student heißt " + name + " und hat die id " + id);
        }
      }
      
      //3. XML from scratch
      Document newDoc = db.newDocument();
      Element newRoot = newDoc.createElement("Bibliothek");
      newDoc.appendChild(newRoot);
      
      Element firstBook = newDoc.createElement("Buch");
      firstBook.setAttribute("isbn""123-4");
      Text sparbuch = newDoc.createTextNode("Sparbuch");
      firstBook.appendChild(sparbuch);
      newRoot.appendChild(firstBook);
      
      Element secondBook = newDoc.createElement("Buch");
      secondBook.setAttribute("isbn""456-7");
      Text herrDerRinge = newDoc.createTextNode("Herr der Ringe");
      secondBook.appendChild(herrDerRinge);
      newRoot.appendChild(secondBook);
      
      //4. print or create file
      OutputFormat format = new OutputFormat(dom);
      format.setIndenting(true);
      XMLSerializer serializerSysOut = new XMLSerializer(System.out, format);
      serializerSysOut.serialize(newDoc);
      
      FileOutputStream output = new FileOutputStream(new File("Buecheer.xml"));
      XMLSerializer serializer = new XMLSerializer(output, format);
      serializer.serialize(newDoc);
    catch (ParserConfigurationException pce) {
      pce.printStackTrace();
    catch (SAXException se) {
      se.printStackTrace();
    catch (IOException ioe) {
      ioe.printStackTrace();
    }

  }
}

XML-Verarbeitung mit DOM4J

Die Bibliothek Dom4J (www.dom4j.org) bietet sich für das Verarbeiten von XML-Dokumenten an. Es erlaubt es Dokumente programmatisch zu erstellen, auszugeben und zu durchsuchen. Mit dem DocumentHelper können auch String, welche einem XML-Dokument entsprechen, in Instanzen der Klasse Document zu überführen.

package xmlParsingDom4J;

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.DefaultAttribute;

public class StartDom4J {

  public static void main(String[] argsthrows Exception{
    StartDom4J start = new StartDom4J();
    Document document = DocumentHelper.createDocument();
    Element root = document.addElement("root");

    Element author1 = root.addElement("author");
    author1.addAttribute("name""James");
    author1.addAttribute("location""UK");
    author1.addText("James Strachan");

    Element author2 = root.addElement("author");
    author2.addAttribute("name""Bob");
    author2.addAttribute("location""US");
    author2.addText("Bob McWhirter");
    
    //als Text ausgeben
    String text = document.asXML();
    System.out.println("Dokument: " + text);
    
    //durch iteratieren
    start.treeWalk(document.getRootElement());
    
    //suchen mit XPath
    start.suchenMitXPath(document, "//author[text()='James Strachan']");
    start.suchenMitXPath(document, "//author[@location='US']");
    
    //in Datei ausgeben
    start.write(document, "./output.xml");
    
    //Neues Dokument erzeugen, indem Text geparst wird
    document = DocumentHelper.parseText("<HTWG><student id=\"2\">Carla</student><student id=\"3\">Carl</student></HTWG>");
    start.write(document, "output2.xml");
  }


  public void write(Document document, String paththrows IOException {
    // In Datei schreiben (alternativ zu new FileWriter einfach System.out) 
    // Format kann weggelassen oder durch createCompactFormat ersetzt werden
    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter writer = new XMLWriter(new FileWriter(path), format);
    writer.write(document);
    writer.close()//bei System.out nicht notwendig
  }
  
  
  /**
   * Über Dokument iterieren (rekursiv)
   @param element
   */ 
  public void treeWalk(Element element) {
          for int i = 0, size = element.nodeCount(); i < size; i++ ) {
              Node node = element.node(i);
              if node instanceof Element ) {
                  treeWalk( (Elementnode );
                  System.out.println("Element heißt: " + node.getName() 
                      " mit Wert " + node.getStringValue() +  
                      " und mit Attributen");
                  
                  List<DefaultAttribute> attributes = ((Element)node).attributes();
                  for(DefaultAttribute attribute : attributes) {
                    System.out.println(attribute.getName() " und Wert " + attribute.getValue());
                  }
              else {
                System.out.println("Anderer Node "+ node);
              }
          }
      }
   
  /**
   * Mit XPath suchen
   @param document
   @param xpath
   */ 
  public void suchenMitXPath(Document document, String xpath){
     List<Node> nodes = document.selectNodesxpath );
     System.out.println("Anzahl gefunden: " + nodes.size());
     for (Node node : nodes) {
       System.out.println("Node gefunden: " + node.getName() " mit Wert " + node.getStringValue());
     }
   }
}