© 2004-2006, Rainer Schmidberger, ISTE
XML und Java
Rainer Schmidberger
Rainer.Schmidberger@informatik.uni-stuttgart.de
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