© Holger Röder Winter 2008/2009 Programmentwicklung se Java: Kapitel 9 Java und XML Programmentwicklung WS 2008/2009 Holger Röder [email protected] © Holger Röder Einführung in XML XML-Verarbeitung in Java Document Object Model (DOM) JDOM Ein- und Ausgabe von XML-Dateien Navigation im DOM-Baum Änderung von XML-Dokumenten Programmentwicklung Winter 2008/2009 Überblick über Kapitel 9 se 2 © Holger Röder Winter 2008/2009 eXtensible Markup Language (XML) XML ist eine Auszeichnungssprache zur Strukturierung von Daten. Ein XML-Dokument besteht aus Elementen. Elemente werden durch Tags gekennzeichnet: <element> … </element> Elemente können Text oder (hierarchisch geschachtelt) weitere Elemente enthalten. Elemente können Attribute besitzen. Programmentwicklung Element Person se <Person PersonalNr="007"> <Name>Coder</Name> Attribut PersonalNr <Vorname>Carl</Vorname> <Adresse> <Strasse>Hauptstraße 3</Strasse> <Plz>70569</Plz> Text <Stadt>Stuttgart</Stadt> </Adresse> </Person> 3 © Holger Röder Winter 2008/2009 Programmentwicklung se Eigenschaften von XML-Dokumenten XML-Dokumente sind durch Elemente mit Inhalten und/oder Attributen hierarchisch strukturiert XML-Dokumente sind wohlgeformt: Jedes Element besteht aus Anfangs- und End-Tag oder aus einem einzelnen abgeschlossenen Tag <Student>…</Student> oder <Student /> Genau ein „Wurzelelement“ enthält alle weiteren Elemente Öffnende und schließende Tags sind symmetrisch angeordnet <Person>…<Name>…</Name>…</Person> Sonderzeichen im Text werden als Entitäten codiert & < > etc. codiert als &amp; &lt; &gt; etc. XML-Dokumente können Kommentare enthalten <!-- Kommentar --> XML-Dokumente können (als erste Zeile) eine Kopfdefinition enthalten <?xml version="1.0"?> Die Struktur konkreter XML-Dokumente kann durch Document Type Definitions (DTD) oder XML Schemas definiert werden. 4 © Holger Röder Winter 2008/2009 Programmentwicklung Beispiel: XML-Dokument <?xml version="1.0" encoding="utf-8"?> <PersonenListe> <Person PersonalNr="007"> <Name>Clement</Name> Hierarchische Anordnung Wurzelelement von Elementen <Vorname>Carl</Vorname> PersonenListe <Adresse> <Strasse>Hauptstraße 3</Strasse> <Plz>70569</Plz> <Stadt>Stuttgart</Stadt> </Adresse> </Person> <Person PersonalNr="008"> <Name>Ahrens</Name> <Vorname>Annemarie</Vorname> <Adresse> <Strasse>Heilbronnerstr. 44</Strasse> <Plz>70806</Plz> <Stadt>Kornwestheim</Stadt> </Adresse> Person mit <Adresse> zwei Adressen <Strasse>Piazza di Lago</Strasse> <Plz>I-30672</Plz> <Stadt>Sirmione</Stadt> </Adresse> </Person> </PersonenListe> se 5 © Holger Röder Winter 2008/2009 Programmentwicklung se Java und XML Java unterstützt beim Umgang mit XML-Dokumenten drei verschiedene Verabeitungsarten. DOM-basierte APIs: Das komplette XML-Dokument wird als Baumstruktur (Document Object Model) im Speicher repräsentiert. Æ W3C-DOM, JDOM, dom4j Ereignisbasierte Push-APIs: Der XML-Parser ruft Methoden auf, wenn bestimmte Bestandteile des XML-Dokuments (öffnende/schließende Tags, Text etc.) gelesen werden (Callback-Prinzip). Æ SAX (Simple API for XML) Pull-APIs: Die einzelnen Bestandteile des XML-Dokuments werden „auf Anfrage“ sequentiell vom XML-Parser geholt. Æ StAX (Streaming API for XML) Häufig werden auch Kombinationen dieser Ansätze eingesetzt. Unter der Abstraktionsschicht Java API for XML Processing (JAXP) sind im JDK verschiedene XML-Technologien zusammengefasst. 6 © Holger Röder Winter 2008/2009 Programmentwicklung se Document Object Model – DOM-Baum … <Person PersonalNr="007"> <Name>Clement</Name> <Vorname>Carl</Vorname> Document <Adresse> <Strasse>Hauptstraße 3</Strasse> <Plz>70569</Plz> <Stadt>Stuttgart</Stadt> PersonenListe </Adresse> </Person> … 1. Person PersonalNr Name Vorname "007" 2. Person etc. "Clement" 7 © Holger Röder JDOM ist eine DOM-basierte Java-Bibliothek für die Verarbeitung von XML-Dateien. JDOM ist ein Open-Source-Projekt: http://www.jdom.org Die vorgestellten JDOM-Klassen liegen im Paket org.jdom oder in Unterpaketen. Programmentwicklung Winter 2008/2009 JDOM se 8 © Holger Röder Winter 2008/2009 XML-Dokumente erzeugen und ausgeben Die zentrale Klasse org.jdom.Document repräsentiert ein XMLDokument. Vorhandene XML-Dateien können als XML-Dokument eingelesen werden: // Leeres XML-Dokument erzeugen Document emptyDoc = new Document(); XML-Datei parsen, DOM-Baum erzeugen // Existierende XML-Datei als Dokument einlesen Document doc = new SAXBuilder().build("PersonenListe.xml"); Programmentwicklung XML-Dokumente können einfach ausgegeben werden: se XMLOutputter outputter = new XMLOutputter(); // Ausgabe auf die Konsole outputter.output(doc, System.out); Ausgabe-Objekt übernimmt Formatierung etc. // Ausgabe in eine Datei outputter.output(doc, new FileOutputStream("PersonenListe2.xml")); 9 © Holger Röder Winter 2008/2009 Programmentwicklung se XML-Elemente Die Klasse Element repräsentiert ein XML-Element im Dokument. Über die Methode Document.getRootElement() kann das Wurzelelement ermittelt werden. Ausgehend von einem Element kann zu untergeordneten Elementen im DOM-Baum navigiert werden: boolean hasChildren() – Unterelemente vorhanden? Element getChild(String name) liefert das erste Unterelement mit dem angegebenen Namen. List getChildren(String name) liefert eine Liste aller Unterelemente mit dem angegebenen Namen. Der Text eines Elements kann mit String getText() ermittelt werden. Element Person, Unterelement Name <Person PersonalNr="007"> <Name>Clement</Name> ... Text des Name-Elements 10 © Holger Röder Winter 2008/2009 Programmentwicklung se Attribute Ein Element kann Attribute besitzen: Attribute getAttribute(String name) liefert das Attribut mit dem angegebenen Namen List getAttributes() liefert alle Attribute eines Elements als Liste Attribut PersonalNr des Elements Person <Person PersonalNr="007"> <Name>Clement</Name> ... Attribute repräsentiert ein Attribut eines Elements. String getValue() liefert den Wert des Attributs int getIntValue() liefert den Wert als int-Wert (analog für andere primitive Datentypen) 11 © Holger Röder Winter 2008/2009 Navigation im DOM-Baum ... <Person PersonalNr="007"> <Name>Clement</Name> <Vorname>Carl</Vorname> Document <Adresse> <Strasse>Hauptstraße 3</Strasse> getRootElement() <Plz>70569</Plz> <Stadt>Stuttgart</Stadt> PersonenListe </Adresse> </Person> ... getChildren("Person") Programmentwicklung 1. Listenelement se 1. Person getChild("Name") 2. Listenelement PersonalNr getAttribute("PersonalNr") "007" 2. Person getValue() Name getText() "Clement" 12 © Holger Röder Winter 2008/2009 Programmentwicklung se Änderung des XML-Dokuments Elemente und Attribute eines XML-Dokuments können mit JDOM beliebig erzeugt und verändert werden. Document doc = new Document(); Element personenListe = new Element("PersonenListe"); doc.setRootElement(personenListe); Element person1 = new Element("Person"); Attribute personalNr1 = new Attribute("PersonalNr", "08/15"); person1.setAttribute(personalNr1); Element vorname1 = new Element("Vorname"); vorname1.setText("Carl"); person1.addContent(vorname1); Mehr zur JDOM-API: http://www.jdom.org/docs/apidocs/ <?xml version="1.0" encoding="UTF-8"?> <PersonenListe> <Person PersonalNr="08/15"> <Vorname>Carl</Vorname> </Person> </PersonenListe> 13