se XML und Java

Werbung
© 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
Herunterladen