seminar: xml-verarbeitungskonzepte ws 2007/2008 sebastian potthoff
DESCRIPTION
Seminar: XML-Verarbeitungskonzepte WS 2007/2008 Sebastian Potthoff. Agenda. XML-Grundlagen Parser APIs SAX – Simple API for XML DOM – Document Object Model StAX – Streaming API for XML Zusammenfassung XML-Anfragesprachen XPath XQuery Xcerpt Zusammenfassung. XML-Grundlagen. - PowerPoint PPT PresentationTRANSCRIPT
Seminar: XML-Verarbeitungskonzepte
WS 2007/2008
Sebastian Potthoff
Agenda
1. XML-Grundlagen2. Parser APIs
1. SAX – Simple API for XML2. DOM – Document Object Model3. StAX – Streaming API for XML4. Zusammenfassung
3. XML-Anfragesprachen1. XPath2. XQuery3. Xcerpt4. 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
Pull-Parser Anwendung
Anfrage nach nächster Element
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
Push-Parser Anwendung
Ruft Callback-Methode
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 Content-Handler der Applikation implementiert
• Content-Handler-Schnittstelle definiert Callback-Methoden für die versch. Ereignisse
• Der Parser ruft zu jedem Ereignis eine Callback-Methode auf
SAX Parser
<artikel> <author> Sebastian </author></artikel>
Content Handler
ContentHandler Interface
Parser
liest
Applikation
implementiert
Aufruf der Callback-Methoden
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
Mayer
buchshop
author
zeitschriftbuch
Document
preis
<buchshop> <buch preis=„10€“> <author>Mayer</author> <titel>XML</titel> </buch> <zeitschrift> <titel>Java</titel> </zeitschrift></buchshop> titel
XML
titel
Java
10€
DOM: Funktionsweise
• DOM-Parser ist ein Einschritt-Pull-Parser
• 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
Zusätzlich:Zugriff über Namen und Objektidentifizierer:• getElementByID(), getElementByTagName()
Kontext-knoten
firstChild
nextSiblingpreviousSibling
lastChild
parent
…childNodes
DOM-Bewertung
- Resourcenverbrauch: Dokument wird vollständig im Speicher gehaltenVerarbeitung von großen
Dokumenten daher problematisch+ Wiederholter Zugriff auf das
Objektmodell möglich+ Modifikationen und Schreiben von XML-
Dokumente möglich
StAX – Streaming API for XML
StAX – Streaming API for XML
• Als jüngster Ansatz zum Parsen von XML-Daten 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 XML-Elementen
• 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 erzeugtwriter.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 Strukturwriter.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 API- Realisierungen flexiblerer Umgang
+ Je nach Wahl ähnlich performant wie SAX
+ Fähigkeit, Dokumente schreiben zu können
Zusammenfassung
Kriterium
SAX DOM StAX-
Cursor-API
StAX-Iterator-
API
Klassifikation Push-Mehrschritt
Pull-Einschritt
Pull-Mehrschritt
Pull-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 (XML-QL) Ansatz
2007
2000
1999
1998
1997
1996
XQuery
QuiltXML-QL
XQL
XSLT Lorel
OQL
SQL
Xcerpt2004
XPath
XPath
• 1999 vom W3C vorgestellt• Grundlage für verschiedene W3C-
Standards 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 Navigations-richtung vom Kontextknoten aus
• Es gibt elf Achsen sowie Namensraum- und 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")//itemlet $p := document("data/PO.xml")//powhere $i/itemno= $p//itemnoreturn
<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 Update- mechanismus
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
address-book { &o1 @ person { name [ first [ "Mickey" ], last [ "Mouse" ] ], phone [ " 50773 "], knows [ ^&o2 ]}, &o2 @ person { name [ first [ "Donald" ], last [ "Duck" ] ], knows [ ^&o1 ] }}
Person[…]Person[…]
Name[…]
Last[…]First[…]
First[…] Last[…]
Name[…]
Phone[…]
Knows[…]
„50773“
Mickey Mouse Donald Duck
Knows[…]
Adress-book[...]
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
B B
D E D E G
C B F
A
Konstruktionsterme
• Die aus Anfragen gebundenen Variablen werden neu angeordnet
• Konstruktion vollständiger Datentermen
Xcerpt-Beispiel: KonstruktionstermeMö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{ all result{var title, var author}}
Liefert:
results { result { title { "Vikinga Blot" }, author { last { "Ingelman-Sundberg" }, […] } } result { title { "Folket i Birka pâ Vikingarnas Tid" }, author { last { "Wahl" }, first { "Mats" } } }}
results{ result{var title, var author}}
Liefert:
results { result { title { "Vikinga Blot" }, author { last { "Ingelman-Sundberg" }, […] } }}results { 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-BeispielCONSTRUCT 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 XPath/XQuery XcerptNavigation achsenorientiert musterbasiert
Referenzielle Transparenz
-
Trennung zw. Anfrage und Konstruktion
X
Fähigkeit versch. Arten semistrukt. Daten zu verarbeiten
Über Erweiterungen
Verbreitung ++ -
Danke für die Aufmerksamkeit
…sind noch Fragen?