se
XML und Java
Rainer Schmidberger
schmidrr@informatik.uni-stuttgart.de
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