Advanced   Java   Services JDOM Back Next Up Home


JDOM

JDOM ist eine Softwarebibliothek, die auf www.jdom.org zur freien Verfügung gestellt wird und von Jason Hunter ab dem Jahr 2000 zusammen mit Brett McLaughlin entwickelt wurde. Die aktuelle Version ist 2.0.x und kann von www.jdom.org/downloads heruntergeladen werden (jdom-2.0.x.zip). Die zip-Datei enthält das Javaarchiv jdom-2.0.x.jar, das man Eclipse bekanntgeben muß.


Wozu JDOM

Kurz gesagt: JDOM kann alles, was DOM kann, nur einfacher...


Die JDOM API

findet man unter www.jdom.org/docs/apidocs




JDOM2 und das neue XPath-Konzept

Es ist nicht ratsam DOM und JDOM zu mischen. Die Klassen und Interfaces haben zum Teil denselben Namen und auch recht ähnliche Funktionalität, sind aber nicht verträglich, da sie in völlig verschiedenen Vererbungshierarchien angelegt sind. Auch das XPath-Konzept von JDOM ist nicht mit dem von DOM verträglich. JDOM2 hat darüber hinaus sogar noch ein neues XPath-Konzept, das mit dem XPath der Vorgängervwersion JDOM1 nicht verträglich ist. Das neue Konzept wird im nächsten Kapitel vorgestellt.

Um mit der neuen org.jdom2.xpath.XPathFactory arbeiten zu können ist ein weiteres jar-Archiv mit dem Namen jaxen-1.1.x.jar notwendig. Dieses Archiv erhält man unter jaxen.codehaus.org/releases.html


Eine XML-Datei mit JDOM einlesen

JDOM verfügt über mehrere Builder-Klassen (DOMBuilder, SAXBuilder, StAXEventBuilder, StAXStreamBuilder) um einen Baum aufzubauen. Beliebt ist der SAXBuilder, weil er sehr performant arbeitet.

Mit JDOM wird das in (maximal) zwei Zeilen erledigt.

import java.io.IOException;
import org.jdom2.Document;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

private static void einlesen()
{
   String xmlfile = "buecher.xml";

   try
   {
      SAXBuilder saxBuilder = new SAXBuilder();
      Document doc = saxBuilder.build(xmlfile);
      //.. do something
   }
   catch (JDOMException | IOException ex)
   {
      // TODO Auto-generated catch block
      ex.printStackTrace();
   }
}

Navigieren ohne XPath

Wir geben die Daten zu den Büchern auf die Konsole aus

private static void navigieren()
{
   String xmlfile = "buecher.xml";

   try
   {
      SAXBuilder saxBuilder = new SAXBuilder();
      Document doc = saxBuilder.build(xmlfile);

      Element root = doc.getRootElement(); // [Element: ]
      List<Element> buch = root.getChildren();  // 3-mal [Element: <buch/>]
      for (Element elem : buch)
      {
         System.out.print(elem.getName() + " (");  // buch
         List<Attribute> attributes = elem.getAttributes();
         for (Attribute attribute : attributes)
         {
            //System.out.println(attribute.getName());  // liefert type
            System.out.print(attribute.getValue());
         }
         System.out.println(")");

         List<Element> buchdata =  elem.getChildren();
         for (Element ele : buchdata)
         {
            if (ele.getName().equals("titel"))
            {
               System.out.println(ele.getText());
            }
            if (ele.getName().equals("autor"))
            {
               List<Element> autordata =  ele.getChildren();
               for (Element el : autordata)
               {
                  System.out.print(el.getText() + " ");
               }
               System.out.println();
            }
            if (ele.getName().equals("isbn"))
            {
               List<Attribute> attr = ele.getAttributes();  // nur eines
               String value = attr.get(0).getValue();
               System.out.println("isbn-" + value + ": " + ele.getText());
            }
         }
      }
   }
   catch (JDOMException | IOException ex)
   {
      ex.printStackTrace();
   }
}

JDOM-Baum ändern

Wir fügen ein neues Buch ein. Auch und gerade hier kann man mit JDOM sehr intuitiv arbeiten. Auch das Formatieren mit Zeilenumbrüchen ist straightforward.

   private static void alter()
   {
      String xmlfile = "buecher.xml";

      try
      {
         SAXBuilder saxBuilder = new SAXBuilder();
         Document doc = saxBuilder.build(xmlfile);
         Element root = doc.getRootElement(); // [Element: ]
         List buchs = root.getChildren();  // 3-mal [Element: ]

         Element buch = new Element("buch");
         buch.setAttribute("type", "hardcover");
         Element titel = new Element("titel");
         titel.addContent("Madame Bovary");
         Element autor = new Element("autor");
         //autor.addContent("\n");
         Element vorname = new Element("vorname");
         vorname.addContent("Emile");
         Element nachname = new Element("nachname");
         nachname.addContent("Zola");
         Element isbn = new Element("isbn");
         isbn.setAttribute("type", "13");
         isbn.addContent("999-3-12345-3-444");

         buch.addContent("\n      ");
         buch.addContent(titel);
         buch.addContent("\n      ");
         buch.addContent(autor);
         autor.addContent("\n         ");
         autor.addContent(vorname);
         autor.addContent("\n         ");
         autor.addContent(nachname);
         autor.addContent("\n      ");
         buch.addContent("\n      ");
         buch.addContent(isbn);
         buch.addContent("\n   ");

         root.addContent("\n   ");
         root.addContent(buch);
         root.addContent("\n");

         // Kontrollausgabe auf System.out.
         XMLOutputter  xmlOutPutter = new XMLOutputter();
         xmlOutPutter.output(doc, System.out);
      }
      catch (JDOMException | IOException ex)
      {
         // TODO Auto-generated catch block
         ex.printStackTrace();
      }
   }

JDOM-Baum in Datei schreiben

Mit dem XMLOutPutter eine Angelegenheit von wenigen Zeilen.

private static void speichern()
{
   String xmlfile = "buecher.xml";
   String dest = "dest.xml";

   try(BufferedWriter bw = new BufferedWriter(new FileWriter(dest)))
   {
      SAXBuilder saxBuilder = new SAXBuilder();
      Document doc = saxBuilder.build(xmlfile);

      // do something

      XMLOutputter  xmlOutPutter = new XMLOutputter();
      xmlOutPutter.output(doc, bw);
      System.out.println("done");
   }
   catch (JDOMException | IOException ex)
   {
      ex.printStackTrace();
   }
}

Valid XHTML 1.0 Strict top Back Next Up Home