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?