600 likes | 722 Views
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.
E N D
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 • 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 • 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: 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 Applikation Parser Aufruf der Callback-Methoden SAX Parser Content Handler implementiert liest ContentHandler Interface <artikel> <author> Sebastian </author> </artikel>
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-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 Document <buchshop> <buch preis=„10€“> <author>Mayer</author> <titel>XML</titel> </buch> <zeitschrift> <titel>Java</titel> </zeitschrift> </buchshop> buchshop preis zeitschrift buch 10€ author titel titel XML Java Mayer
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 parent Kontext- knoten previousSibling nextSibling … firstChild 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 XML-Dokumente möglich
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 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 API- Realisierungen flexiblerer Umgang • Je nach Wahl ähnlich performant wie SAX • Fähigkeit, Dokumente schreiben zu können
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 XQuery 2007 Xcerpt 2004 2000 Quilt XML-QL 1999 XQL 1998 Lorel 1997 XSLT OQL 1996 SQL
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 • 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 Update- mechanismus
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 • 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“ Last[…] First[…] First[…] Last[…] Mickey Mouse Donald Duck