se XML und Java Rainer Schmidberger [email protected] Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering Seminarunterlagen XML und Java se Was ist XML? <Person PersonalNr="007"> <Name>Müller</Name> <Vorname>Hans</Vorname> <Adresse> <Strasse>Ulmenweg 22</Strasse> <Plz>70565</Plz> <Stadt>Stuttgart</Stadt> </Adresse> </Person> 09.02.2004 EXtensible Markup Language XML ist plattformneutral XML ist sprach-unabhängig Strukturierung des XMLDokuments mittels "Tags" Wohlgeformtheit: öffnende und schließende Tags sind symmetrisch angeordnet Beliebig hierarchischer Aufbau Daten und Struktur-Information werden gemeinsam gespeichert Dadurch: "selbsterklärend" "Schablone regelt den Aufbau (DTD=Document Type Definition) Möglichkeit zu Konsistenzregeln Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 2 1 Seminarunterlagen XML und Java se Java – XML DOM: Document Object Model Ö Ö Ö Ö Ö Ö Standardisierung der W3C (www.w3.org/tr) Seit JDK 1.4 in Java enthalten Interface-Sammlung Implementierung erfolgt durch XML-Parser Einfaches Auslesen und Bearbeiten von XML-Dokumenten I/O-Operationen über JAXP (Java API for XML-Processing) SAX: Simple API for XML Parsing Ö Ereignis-basiertes Modell (event based) Ö Mittels "Callback" werden Ereignisse beim Parsen an einen Event-Handler übermittelt JDOM Ö Ö Ö Ö 09.02.2004 Java-zentriert, objektorientiert Geringfügige Vereinfachung des DOM API "As simple as Java itself" Java-Sammlungsklassen statt der DOM Node-Klassen Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 3 Seminarunterlagen XML und Java se XML-Dokument <PersonenListe> <Person PersonalNr="007"> <Name>Müller</Name> <Vorname>Hans</Vorname> <Adresse> <Strasse>Ulmenweg 22</Strasse> <Plz>70565</Plz> <Stadt>Stuttgart</Stadt> </Adresse> </Person> <Person PersonalNr="008"> <Name>Mustermann</Name> <Vorname>Annemarie</Vorname> <Adresse> <Strasse>Heilbronnerstr. 44</Strasse> <Plz>70806</Plz> <Stadt>Kornwestheim</Stadt> </Adresse> <Adresse> <Strasse>Piazza di Lago</Strasse> <Plz>I-30672</Plz> <Stadt>Sirmione</Stadt> </Adresse> </Person> </PersonenListe> 09.02.2004 Wohlgeformtheit Attribut im öffnenden Tag Person mit zwei Adressen Dokument Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 4 2 Seminarunterlagen XML und Java se XML Prozessor User Interface Weitere Ausgaben Applikation Schnittstelle zwischen Applikation und Prozessor Prozessor Üblicherweise auch als "Parser" bezeichnet Liest XML Dokumente Ermöglicht den Zugriff auf das Dokument Unterscheidung in Validierende und nichtvalidierende Prozessoren Ein-/Ausgabe des XMLDokuments ist Teil der Applikation nicht des Prozessors Die Applikation verwendet den Prozessor Der Prozessor erstellt einen Graphen, der den Dokument Inhalt abbildet XML Dokument 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 5 Seminarunterlagen XML und Java se DOM: Dokument-Baum <PersonenListe> <Person PersonalNr="007"> <Name>Müller</Name> <Vorname>Hans</Vorname> <Adresse> <Strasse>Ulmenweg 22</Strasse> <Plz>70565</Plz> <Stadt>Stuttgart</Stadt> </Adresse> </Person> ... </PersonenListe> Document getDocumentElement PersonenListe item(...) item(0) 1. Person getFirstChild Name PersonalNr = 007 09.02.2004 2. Person getNamedItem("PersonalNr") Vorname getFirstChild Müller item(1) Adresse getNextSibling Hans Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 6 3 Seminarunterlagen XML und Java se DOM Knoten Knoteninhalt Ö Ö Ö Ö Typ Name Wert Attribute Dokumentstruktur Ö Ö Ö Ö Ö Ö 09.02.2004 Elternknoten Erster Kindknoten Letzter Kindknoten Nächster Geschwisterknoten Voriger Geschwisterknoten Liste aller Kindknoten Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 7 Seminarunterlagen XML und Java se DOM Node-Klassen Paket org.w3c.dom Node Type : int Name : String Value : String NodeList Element Attr CharacterData NamedNodeMap Document DocumentType DocumentFragment Text 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 8 4 Seminarunterlagen XML und Java se DOM API (1) Accessor Methoden Ö getNodeName(), getNodeType(), getNodeValue() Ö setNodeValue(String) Navigation im Dokument Ö getParent(), getFirstChild(), getLastChild(), getPreviousSibling(), getNextSibling() Ö getAttributes : NamedNodeMap Ö getChildNotes() : NodeList 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 9 Seminarunterlagen XML und Java se DOM API (2) Änderung eines Dokuments Ö appendChild(Node), insertBefore(Node, Node) Ö replaceChild(node, Node) Ö removeChild(Node) Elemente erzeugen Ö createElement(String), createAttribute(String), createTextNode(String) 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 10 5 Seminarunterlagen XML und Java se javax.xml.parsers // das Factory-Objekt erzeugen DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = null; try { // Parser-Objekt durch die Factury erzeugen db = dbf.newDocumentBuilder(); } catch(Exception e) { ... } Document doc = null; try { // Dokument parsen doc = db.parse("PersonenListe.xml"); } catch(Exception e) { ... } // das Dokument auswerten oder bearbeiten Element personenListeElement = doc.getDocumentElement(); NodeList personenNodeList = personenListeElement.getElementsByTagName("Person"); 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 11 Seminarunterlagen XML und Java se XML als Baum auslesen static private void leseXMLKnoten(Node n) { System.out.print(" Knotenname = " + n.getNodeName()); String val = n.getNodeValue(); if(val != null && !val.equals("")) { System.out.print(" Knotenwert =" + val); } System.out.println(); for(Node kindKnoten = n.getFirstChild(); kindKnoten != null; kindKnoten = kindKnoten.getNextSibling()) { leseXMLKnoten(kindKnoten); } Baumstruktur des XML-Dokuments legt eine rekursive Auswertung nahe Aber: lineare Auswertung z.B. über alle Kinder eines Knotens ist ebenso möglich } 09.02.2004 Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 12 6 Seminarunterlagen XML und Java se XML linear auslesen Element personenListeElement = doc.getDocumentElement(); NodeList personenNodeList = personenListeElement.getElementsByTagName("Person"); for(int i = 0; i < personenNodeList.getLength(); i++) { Node personNode = personenNodeList.item(i); System.out.println(i + ". Person ----------------------------------"); NodeList personNodeChildNodes = personNode.getChildNodes(); for(int j = 0; j < personNodeChildNodes.getLength(); j++) { Node personElementNode = personNodeChildNodes.item(j); Node personElementNodeValue = personElementNode.getFirstChild(); if(personElementNodeValue != null) { System.out.println(" Knotenname = " + personElementNode.getNodeName() + " Knotenwert = " + personElementNodeValue.getNodeValue()); } } } Ausgabe: 09.02.2004 0. Person ---------------------------------Knotenname = Name Knotenwert = Müller Knotenname = Vorname Knotenwert = Hans Knotenname = Adresse Knotenwert = 1. Person ---------------------------------Knotenname = Name Knotenwert = Mustermann Knotenname = Vorname Knotenwert = Annemarie Knotenname = Adresse Knotenwert = Knotenname = Adresse Knotenwert = Adresse hat nicht einen unmittelbaren "value" Copyright © 2004, Rainer Schmidberger, Universität Stuttgart, Institut für Softwaretechnologie, Abt. Software Engineering 13 7