© 2004-2006, Rainer Schmidberger, ISTE XML und Java Rainer Schmidberger [email protected] se Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE 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> se 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 Folie 173 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE 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 se Ö Ö Ö Ö Java-zentriert, objektorientiert Geringfügige Vereinfachung des DOM API "As simple as Java itself" Java-Sammlungsklassen statt der DOM Node-Klassen Folie 174 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE 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> se Wohlgeformtheit Attribut im öffnenden Tag Person mit zwei Adressen Dokument Folie 175 User Interface Weitere Ausgaben Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE XML Prozessor se 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 Folie 176 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE 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> Programmentwicklung, Vorlesungsskript getDocumentElement PersonenListe item(...) item(0) 1. Person se Document getFirstChild Name PersonalNr = 007 2. Person getNamedItem("PersonalNr") Vorname getFirstChild Müller item(1) Adresse getNextSibling Hans Folie 177 Knoteninhalt Ö Ö Ö Ö Programmentwicklung, Vorlesungsskript Typ Name Wert Attribute Dokumentstruktur 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE DOM Knoten se Ö Ö Ö Ö Ö Ö Elternknoten Erster Kindknoten Letzter Kindknoten Nächster Geschwisterknoten Voriger Geschwisterknoten Liste aller Kindknoten Folie 178 Paket org.w3c.dom 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE DOM Node-Klassen Node Type : int Name : String Value : String NodeList Element Attr CharacterData NamedNodeMap Document DocumentType DocumentFragment Programmentwicklung, Vorlesungsskript Text se Folie 179 Accessor Methoden Ö getNodeName(), getNodeType(), getNodeValue() Ö setNodeValue(String) Navigation im Dokument Ö getParent(), getFirstChild(), getLastChild(), getPreviousSibling(), getNextSibling() Ö getAttributes : NamedNodeMap Ö getChildNotes() : NodeList Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE DOM API (1) se Folie 180 Änderung eines Dokuments Ö appendChild(Node), insertBefore(Node, Node) Ö replaceChild(node, Node) Ö removeChild(Node) Elemente erzeugen Ö createElement(String), createAttribute(String), createTextNode(String) Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE DOM API (2) se Folie 181 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE 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"); se Folie 182 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); } 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE XML als Baum auslesen Baumstruktur des XML-Dokuments legt eine rekursive Auswertung nahe Aber: lineare Auswertung z.B. über alle Kinder eines Knotens ist ebenso möglich Programmentwicklung, Vorlesungsskript } se Folie 183 Programmentwicklung, Vorlesungsskript 01.02.2006 © 2004-2006, Rainer Schmidberger, ISTE 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: se 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" Folie 184