Präsentation

Werbung
Seminar: XML-Verarbeitungskonzepte
WS 2007/2008
Sebastian Potthoff
Agenda
1. XML-Grundlagen
2. Parser APIs
1. SAX – Simple API for XML
2. DOM – Document Object Model
3. StAX – Streaming API for XML
4. Zusammenfassung
3. XML-Anfragesprachen
1. XPath
2. XQuery
3. Xcerpt
4. Zusammenfassung
XML-Grundlagen
• Allgemein textuelle Darstellung bekannt
• Beschreibung der Daten durch Tags
• Strukturierung durch Schachtelung
• Wohlgeformtheit
– Existenz eines Wurzelelements
– Korrekte Folge von Start- und Endtags
– Eindeutige Attributbezeichner innerhalb
eines Tags
XML Infoset
• Abstrakte Sicht auf Daten
• Infoset eines XML-Dokuments besteht
aus Informationseinheiten (information
items)
– Dokumentinformationseinheit
– Elementinformationseinheit
– Attributinformationseinheit
– Kommentarinformationseinheit
Parser API
Parser API
Klassifikationsmerkmale:
• Pull- vs. Push-basierte Parser
• Ein- vs. Mehrschritt-Parser
Pull-basierte Parser-Schnittstelle
• Applikation kontrolliert den Parse-Vorgang
• Abruf einzelner Dokumentelemente durch die
Applikation
Anfrage nach nächster Element
Pull-Parser
Anwendung
Liefert Element
Push-basierte Parser-Schnittstelle
• Parser kontrolliert den Parse-Vorgang
• Parser benachrichtigt die Applikation mittels
Ereignissen
• Ereignisse sind das Auftreten von
Informationseinheiten im Dokument
Ruft Callback-Methode
Push-Parser
Anwendung
Einschritt- vs. Mehrschritt-Parser
Einschritt-Parser
• Jedes Dokument wird in einem Schritt
verarbeitet
Mehrschritt-Parser
• Das Dokument wird schrittweise
verarbeitet
• Schritte durch den Parser bestimmt
SAX – Simple API for XML
SAX: Ereignisse
• ereignisorientierter Mehrschritt-Push-Parser
• Parser arbeitet Quelldokument sequentiell ab
• erzeugt dabei Ereignisse für die Informations
Einheiten des Dokuments
– Geschachtelte Strukturen werden durch
Start- und End-Ereignisse signalisiert
• startDocument, endDocument
• startElement, endElement
SAX: Signalisierung von Ereignissen an
die Anwendung
• Callback-Methoden werden durch den ContentHandler der Applikation implementiert
• Content-Handler-Schnittstelle definiert CallbackMethoden für die versch. Ereignisse
• Der Parser ruft zu jedem Ereignis eine CallbackMethode auf
Parser
SAX Parser
liest
<artikel>
<author>
Sebastian
</author>
</artikel>
Aufruf der
Callback-Methoden
Applikation
Content Handler
implementiert
ContentHandler
Interface
SAX: Bewertung
 Dokument wird nicht im Speicher gehalten
+ Verarbeitung von großen Dokumenten
möglich
- Wiederholter Zugriff auf bereits verarbeitete
Knoten nicht möglich
- Ausschließlich lesender Zugriff
DOM – Document Object Model
DOM-Datenmodell
• Datenmodell beschreibt Daten als
Knotenhierarchie in Form eines Baums
• Datenmodell ähnelt dem XML-Infoset.
Terminologie weicht jedoch ab:
– XML Infoset: Informationseinheiten
(information items)
– DOM: Knoten (Nodes)
Beispiel
<buchshop>
<buch preis=„10€“>
<author>Mayer</author>
<titel>XML</titel>
</buch>
<zeitschrift>
<titel>Java</titel>
</zeitschrift>
</buchshop>
Document
buchshop
preis
zeitschrift
buch
10€
author
titel
titel
Mayer
XML
Java
DOM: Funktionsweise
• DOM-Parser ist ein Einschritt-PullParser
• Nach Parse-Vorgang steht vollständiges
Dokument als Objektstruktur im
Speicher bereit
• Für den Zugriff auf die Daten bietet die
DOM API eine achsenorientierte
Navigation
DOM-Navigation
Achsenorientierte Navigation
parent
previousSibling
firstChild
Kontextknoten
…
nextSibling
lastChild
childNodes
Zusätzlich:
Zugriff über Namen und Objektidentifizierer:
• getElementByID(), getElementByTagName()
DOM-Bewertung
- Resourcenverbrauch: Dokument wird
vollständig im Speicher gehalten
Verarbeitung von großen
Dokumenten daher problematisch
+ Wiederholter Zugriff auf das
Objektmodell möglich
+ Modifikationen und Schreiben von XMLDokumente möglich
StAX – Streaming API for XML
StAX – Streaming API for XML
• Als jüngster Ansatz zum Parsen von XMLDaten vorgestellt (2004)
• Ereignisorientierte Parser meist als Push
Parser umgesetzt
• Gründe für Pull-basierten Parser:
– Verarbeitung, wenn Applikation bereit
– Struktur des Codes entspricht Struktur des
XML-Dokuments
– Zustandsverwaltung
• Ziel: ereignisorientierter Pull-Parser
• seit Java 6 Teil der Java-Standardbibliothek
StAX-Übersicht
• verbindet die Vorteile von SAX und DOM
– Effizientes Arbeiten mit großen
Dokumenten
– Schreiben/Erzeugen von XML-Dokumeten
• StAX gliedert sich in
– Cursor-API
– Iterator-API
Cursor-API
• logischer Cursor über einem Strom von XMLElementen
• Auf dem Strom von Ereignissen wird mit denen
aus dem Iterator-Interface bekannten Methoden
navigiert
• In jedem von der Anwendung ausgelösten Schritt
wird der Cursor von einem ereignisauslösenden
Element zum Nächsten geschoben
• Cursor verwaltet Ereigniseigenschaften
– ressourcensparend
• Ereignisauslösende Elemente:
StartDocument, EndDokument, StartElement…
(vgl. SAX)
Beispiel
Auszug: liefert die Namen der Startelemente
while (parser.hasNext()) {
int event = parser.next();
if (event == XMLStreamConstants.END_DOCUMENT) {
parser.close();
break;
}
if (event == XMLStreamConstants.START_ELEMENT) {
System.out.println(parser.getLocalName());
}
}
Iterator-API
• Ereignisse und ihre Eigenschaften werden in
Form von Ereignisobjekten an die Anwendung
übergegeben
• Verwalten vieler Objekte steigert
Ressourcenbedarf
• Objektorientierte Verarbeitung entspricht
heutiger Programmentwicklung
• Navigation zwischen Ereignissen über
Methoden des Iterator-Interface
Beispiel
Auszug: Suche nach einem Startelement eines ICON-Objekts
XMLEventReader reader = factory.createXMLEventReader(uri,
input);
while (reader.hasNext()) {
XMLEvent event = reader.peek();
if (event.isStartElement()) {
StartElement start = event.asStartElement();
if (ICON.equals(start.getName())) {
System.out.println(reader.getElementText());
break;
}
}
reader.nextEvent();
}
Schreiben
• Cursor- und Iterator-API erlauben das
Schreiben von Dokumenten
• Zentrale Klassen:
– XMLStreamWriter
– XMLEventWriter
Cursor-API
XMLStreamWriter writer = factory.createXMLStreamWriter(
new FileOutputStream( "c:/party.xml" ));
// Der XML-Header wird erzeugt
writer.writeStartDocument();
// Zuerst wird das Wurzelelement mit Attribut geschrieben
writer.writeStartElement( "party" );
writer.writeAttribute( "datum", "31.12.01" );
// Unter dieses Element wird das Element gast mit einem Attribut erzeugt
writer.writeStartElement( "gast" );
writer.writeAttribute( "name", "Albert Angsthase" );
writer.writeEndElement();
writer.writeEndElement();
writer.writeEndDocument();
writer.close();
Iterator-API
XMLEventWriter writer = outputFactory.createXMLEventWriter(
new FileOutputStream( "c:/party.xml" ));
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
XMLEvent header = eventFactory.createStartDocument();
XMLEvent startRoot = eventFactory.createStartElement( "", "", "party" );
XMLEvent datumAttribut = eventFactory.createAttribute( "datum", "31.12.01" );
XMLEvent endRoot = eventFactory.createEndElement( "", "", "party" );
XMLEvent startGast = eventFactory.createStartElement( "", "", "gast" );
XMLEvent name = eventFactory.createAttribute( "name", "Albert Angsthase" );
XMLEvent endGast = eventFactory.createEndElement( "", "", "gast" );
XMLEvent endDocument = eventFactory.createEndDocument();
// Schreiben der Struktur
writer.add( header );
writer.add( startRoot );
writer.add(datumAttribut);
writer.add( startGast );
writer.add( name );
writer.add( endGast );
writer.add( endRoot );
writer.add( endDocument );
writer.close();
Bewertung
• Dritte Variante auf das XML-Infoset
zuzugreifen
+ Durch die verschiedenen APIRealisierungen flexiblerer Umgang
+ Je nach Wahl ähnlich performant wie
SAX
+ Fähigkeit, Dokumente schreiben zu
können
Zusammenfassung
Kriterium
SAX
Klassifikation
DOM
StAXCursorAPI
StAXIteratorAPI
PushPullPullPullMehrschritt Einschritt Mehrschritt Mehrschritt
Wiederholter
Zugriff
X

X
X
Eignung für
große
Dokumente
++
-
++
+
Schreiben
X



XML-Anfragesprachen
XML-Anfragesprachen
• Entwicklung von XML-Anfragesprachen zwischen
1996 und 1998 begonnen
• durch Internet- und Datenbank-Gemeinden
beeinflusst
• Parallele Entwicklung verschiedener Sprachen mit
navigierendem (XQL) und musterbasiertem (XMLQL) Ansatz
XQuery
2007
2004
2000
Xcerpt
Quilt
XML-QL
1999
1998
XQL
1997
XSLT
1996
Lorel
OQL
SQL
XPath
XPath
• 1999 vom W3C vorgestellt
• Grundlage für verschiedene W3CStandards zur Adressierung von
Dokumentteilen
XPath-Datenmodell
• Sequenz: geordnete Listen von Items,
die Duplikate enthalten kann
• Knoten und atomare Werte als
Sequenzeinträge
– Repräsentieren Baumstruktur
Pfadausdrücke
• Adressiert Sequenzen von Knoten
• Ein Pfadausdruck besteht aus beliebig
vielen Schritten, die durch Slashes „/“
getrennt werden
• Jeder Schritt besteht aus drei
Bestandteilen:
– Achse
– Knotentest
– Prädikat
Achsen
• Achse beschreibt die Navigationsrichtung vom Kontextknoten aus
• Es gibt elf Achsen sowie Namensraumund Attributachse
– parent, ancestor, following-sibling…
Knotentest/Prädikate
• Knotentest
– Namentests (name test)
– Typtests (type test):
• Primäre Knotentyp (principle node kind)
• Spezifischer Knotentest
• Prädikate
– Selektion von Knoten, die das Prädikat erfüllen
Beispiel:
child::para[position()=1]
XQuery
XQuery
• 1998 began die Entwicklung durch eine
Arbeitsgruppe der W3C
• Wichtige Randbedingung war
Kompatibilität zu anderen Standards
des W3C
• Pfadausdrücke (XPath) wichtiges
Element
Die Sprache
• FLWR-Audrücke
– FOR
– LET
– WHERE
– RETURN
Beispiel:
for $i in document("data/items.xml")//item
let $p := document("data/PO.xml")//po
where $i/itemno= $p//itemno
return
<ordered_item> {$i/description/text()} </ordered_item>
Was XQuery nicht ist und nicht kann
• Vorurteil: XQuery ist nicht performant
genug um großen Datenmengen zu
verarbeiten
• XQuery umfasst keinen Updatemechanismus
Musterbasierte Anfragesprachen
Musterbasierte Anfragesprachen
• Alternative zur verbreiteten achsenorientierten
Adressierung Anfrage beschreibt an einem Beispiel
(query-by-example), welche Daten ausgewertet
werden sollen
• Sollen verständlicher sein
Beispiel:
<address-book>
<person>
<name>
<first>Mickey</first>
<last>Mouse</last>
</name>
<phone>$PHONE</phone>
<email>$EMAIL</email>
</person>
</address-book>
Xcerpt
Xcerpt
• 2004 von einer Forschungsgruppe der
LMU München vorgestellt
• Ziel: Verarbeitung verschiedener Arten
von semistrukturierten Daten
– format versatility
– schema versatility
– representational versatility
Xcerpt-Die Sprache
• Muster- / regelbasiert
• Die Sprache gliedert sich in
– Datenterme
– Anfrageterme
– Konstruktionsterme
Xcerpt-Datenterme
• Datenterme:
– Erlauben die Darstellung semistrukturierter
Daten
– Bilden die Grundlage für Anfrageterme
• Datenterme bestehen aus:
– Objektidentifikatoren
– Opt. Namensraumdaten
– Bezeichner
– un- /geordneten Liste von Attributen oder
Subtermen
• Geschweifete Klammer: ungeordnete Liste
• Eckige Klammern: geordnete Liste
• Zu jedem Datenterm gibt es eine Graphdarstellung
Xcerpt-Graphdarstellung
Adress-book[...]
address-book {
&o1 @ person {
name [
first [ "Mickey" ],
last [ "Mouse" ]
],
phone [ " 50773 "],
knows [ ^&o2 ]},
&o2 @ person {
name [
first [ "Donald" ],
last [ "Duck" ]
],
knows [ ^&o1 ]
}
}
Person[…]
Person[…]
Knows[…]
Phone[…]
Name[…]
Knows[…]
Name[…]
„50773“
First[…]
Mickey
First[…]
Last[…]
Last[…]
Mouse
Donald
Duck
Xcerpt-Anfrageterme
• Dienen der Auswahl von Daten
• Beschreiben dazu Muster, die mit Datentermen in
Beziehung gesetzt werden
• Ergebnisse können an Variablen gebunden
werden
• Unvollständige Anfragen bezüglich Tiefe und Breite
Beispiel 1:
report {{
desc section {{
title {{ "Data Terms" }}
}}
}}
Beispiel 2:
students {{
student {{
name { var Name },
optional matrnr { var MatrNr }
}}
}}
Xcerpt-Anfragen
• Es ist möglich Anfrageterme durch AND
und OR zu verknüpfen
Xcerpt-Graph Simulation
• Abbildung zwischen dem Anfragegraph
und dem durch Datenterme definierten
Graphen
• Abbildung führt zu Variablenbelegungen
A
A
B
B
D
E
F
B
C
D
E
G
Konstruktionsterme
• Die aus Anfragen gebundenen
Variablen werden neu angeordnet
• Konstruktion vollständiger Datentermen
Xcerpt-Beispiel: Konstruktionsterme
Mögliche Variablenbelegungen als Ergebnis einer Anfrage:
1. Titel title { "Vikinga Blot" }
Author author { last { "Ingelman-Sundberg" }, first { "Catharina" }}
2. Titel title { "Folket i Birka pâ Vikingarnas Tid" }
Author author { last { "Wahl" }, first { "Mats" }}
results{
result{var title, var author}
}
results{
all result{var title, var author}
}
Liefert:
Liefert:
results {
result {
title { "Vikinga Blot" },
author { last { "Ingelman-Sundberg" }, […] }
}
}
results {
result {
title { "Folket i Birka pâ Vikingarnas Tid" },
author { last { "Wahl" }, first { "Mats" } }
}
}
results {
result {
title { "Vikinga Blot" },
author { last { "Ingelman-Sundberg" }, […] }
}
result {
title { "Folket i Birka pâ Vikingarnas Tid" },
author { last { "Wahl" }, first { "Mats" } }
}
}
Xcerpt-Construct-Query-Rule
• Eine vollständige Anfrage hat die Form:
CONSTRUCT
<construct term>
FROM
<query term>
END
Xcerpt-Beispiel
CONSTRUCT
books-with-prices [
all book-with-prices [
title [ var T ], price-a [ var Pa ], price-b [ var Pb ]
]
]
FROM
and {
in {
resource [ "file:bib.xml" ],
bib [[
book [[
title [ var T ], price [ var Pa ]
]]
]]
},
in {
resource [ "file:reviews.xml" ],
reviews [[
entry [[
title [ var T ], price [ var Pb ]
]]
]]
}
}
END
Xcerpt-Regelverkettung
• Es ist möglich Regeln zu verketten
• Anfragen können so übersichtlicher gestaltet
werden
• Wiederverwendung von Elementen möglich
CONSTRUCT
table [
tr [ td [ "Title" ], td [ "Price at A" ], td [ "Price at B" ] ],
all tr [ td [ var Title], td [ var PriceA], td [ var PriceB] ]
]
FROM
books-with-prices [[
book-with-prices [[
title [[ var Title ]],
price-a [[ var PriceA]],
price-b [[ var PriceB]]
]]
]]
END
Zusammenfassung
Kriterium
Navigation
Referenzielle
Transparenz
Trennung zw.
Anfrage und
Konstruktion
XPath/XQuery
achsenorientiert
Xcerpt
musterbasiert
-

X

Fähigkeit versch.
Arten semistrukt. Über Erweiterungen
Daten zu
verarbeiten

Verbreitung
-
++
Danke für die Aufmerksamkeit
…sind noch Fragen?
Herunterladen