Advanced Java Services | 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ß.
Kurz gesagt: JDOM kann alles, was DOM kann, nur einfacher...
findet man unter www.jdom.org/docs/apidocs
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
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(); } }
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(); } }
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(); } }
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(); } }