330 likes | 536 Views
XML und Datenbanken - XPath, XQuery -. Meike Klettke Universität Rostock Fakultät für Informatik und Elektrotechnik meike@informatik.uni-rostock.de www.xml-und-datenbanken.de. Einleitung. XPath: Adressierung von Knoten des XML-Dokumenten XQuery: ad-hoc Anfragen an XML-Dokumente
E N D
XML und Datenbanken - XPath, XQuery - Meike Klettke Universität Rostock Fakultät für Informatik und Elektrotechnik meike@informatik.uni-rostock.de www.xml-und-datenbanken.de
Einleitung • XPath: Adressierung von Knoten des XML-Dokumenten • XQuery: ad-hoc Anfragen an XML-Dokumente • beides Empfehlungen des W3C
XPath: allgemeine Abarbeitung • Adressierung von Teilen eines Dokumentes • Formulierung von Bedingungen an diese Knotenmengen • XPath-Ausdruck kann aus mehreren Schritten bestehen, Kopplung über / • Ergebnis eines Schrittes sind Knotenmengen (auch die leere Knotenmenge ist möglich) oder einzelne Werte • Abarbeitung erfolgt von links beginnend • Bestandteil der XML-Anfragesprachen (XQuery), Transformationssprachen (XSLT) und XPointer
XPath, zum Datenmodell • XML-Dokument wird als abstrakter Baum betrachtet • Baumstruktur kennt sieben Knotenarten (ähnlich zu DOM) • Wurzelknoten • Elementknoten • Attributknoten • Namensraumknoten • Textknoten • Kommentarknoten • PI-Knoten • Kanten des Baumes stellen die Verbindungen zwischen den Bestandteilen des XML-Dokumentes dar • Entities werden aufgelöst (expandiert)
Aufbau eines Navigationsschrittes • absolute und relative Pfade möglích • absolute Pfade beginnen von der Wurzel des XML-Dokumentes • relative gehen vom Kontextknoten (=aktueller Knoten) aus • Ein Schritt besteht aus: • achse::knotentest[prädikat] • Achse: • Beziehung zwischen dem Kontextknoten und dem zu auszuwählenden Knoten • Knotentest: • legt den Knotentyp und den Namen der zu selektierenden Knoten fest • Zum Beispiel: Knotentyp: Element oder Attribut, Name jeweils wie angegeben, * für alle • Prädikat • Ein, kein oder mehrere Prädikate schränken die Knotenmenge ein • (na ja: kein Prädikat schränkt die Knotenmenge natürlich nicht ein) • Beispiele: • child::href[position()=2] child::autor[last()] • attribute::autorname parent::*
Achsen • child (direkte Nachfolger), • descandant (alle Nachfolgerknoten), • parent, • attribute, • self, • descandant-or-self, • following-sibling (alle nachfolgenden Geschwisterknoten), • following (alle in der Dokumentordnung nachfolgenden Knoten) • preceding-sibling (alle vorhergehenden Geschwisterknoten), • preceding (alle in der Dokumentordnung vorhergehenden Knoten), • anchestor (alle Vorgängerknoten), • anchestor-or-self
Beispiele für XPath /1 unterkuenfte <unterkuenfte> <hotel id="id001“> <name>Strand Hotel Huebner</name> <adresse> <plz>18119</plz> <ort>Warnemuende</ort> ... </adresse> </hotel> .. </unterkuenfte> • /unterkuenfte/hotel • Langform: /child::unterkuenfte/child::hotel • /unterkuenfte/hotel/adresse/../name • Langform: /child::unterkuenfte/child::hotel// • child::adresse/parent::*/child::name hotel id name adresse id001 Strand Hotel Huebner plz ort Warne- muende 18119 Elementknoten Textknoten Attributknoten
Beispiele für XPath /2 unterkuenfte <unterkuenfte> <hotel id="id001“> <name>Strand Hotel Huebner</name> <adresse> <plz>18119</plz> <ort>Warnemuende</ort> ... </adresse> </hotel> .. </unterkuenfte> • /unterkuenfte/hotel/adresse/ort • /unterkuenfte//ort • //ort • Ergebnis immer: <ort>Warnemuende</ort> • /hotel/adresse/ort • Ergebnis: leere Knotenmenge • /unterkuenfte/hotel/adresse/ort/text() • Ergebnis: Warnemuende hotel id name adresse id001 Strand Hotel Huebner plz ort Warne- muende 18119 Elementknoten Textknoten Attributknoten
Prädikate /1 • angegebenes Prädikat wird für jeden Knoten ausgewertet • Knoten bei denen das Ergebnis true ist, werden in das Ergebnis übernommen • Vorhandensein von Werten (Werteselektion) • /buch[@erscheinungsjahr>2000] • /hotel/adresse/ort[text()=„Rostock“] • Strukturselektion – basiert auf strukturellen Eigenschaften (im Gegensatz zu Datenbanken, dort nur Werteselektion) • /hotel[kategorie], hotel[//ort] – Vorhandensein von Elementen • /hotel[@url] – Vorkommen von Attributen • Positionsangabe: wenn Prädikat eine Nummer liefert, dann wird der Knoten der entsprechenden Position übernommen • /hotel[3], ort[1], autor[last()]
Prädikate /2 • Reihenfolge der Prädikatauswertung ist relevant! • Verbindungen von Prädikaten ist durch • and, or (Ergebnis boolescher Wert) • <, >=, >, >=, =, != (Ergebnis boolescher Wert) • +, -, *, mod, div (Ergebnis numerischer Wert) • | dient zur Vereinigung von Knotenmengen • () Klammerung beeinflusst die Ausführungsreihenfolge • XPath-Funktionen (einige waren schon in Beispielen zu sehen) • last() • position() – auch als Kurzform [n] • contains(string, string)
Beispiele für XPath /3 unterkuenfte <unterkuenfte> <hotel id="id001“> <name>Strand Hotel Huebner</name> <adresse> <plz>18119</plz> <ort>Warnemuende</ort> ... </adresse> </hotel> .. </unterkuenfte> • /unterkuenfte/hotel [adresse/ort/text()=“Warnemuende“ or adresse/ort/text()=“Rostock”]/name/text() • /unterkuenfte/hotel[contains(name/text(),”Strand”)] hotel id name adresse id001 Strand Hotel Huebner plz ort Warne- muende 18119 Elementknoten Textknoten Attributknoten
zusammenfassend für XPath • Navigation durch den Baum, der das XML-Dokument darstellt (über Navigationsachsen) • schrittweise Abarbeitung • Ergebnis jedes Schrittes sind Knotenmengen • auf diesen können durch Prädikate Bedingungen formuliert werden • XPath wird in XQuery benötigt
Kriterien für Anfragesprachen /1 (nach Heuer, Scholl) • Ad-Hoc-Formulierung: • Benutzer soll Anfragen formulieren, ohne vollständiges Programm zu schreiben • Deskriptivität: • Benutzer soll formulieren "Was will ich haben?" und nicht "Wie komme ich dahin?". • Mengenorientiertheit: • Jede Operation soll auf Mengen von Daten gleichzeitig arbeiten, nicht navigierend nur auf einzelnen Elementen (one-tuple-at-a-time) • Abgeschlossenheit: • Ergebnis kann als Eingabe für nächste Anfrage verwendet werden • Adäquatheit: • alle Konstrukte des zugrundeliegenden Datenmodells werden unterstützt.
Kriterien für Anfragesprachen /2 (nach Heuer, Scholl) • Orthogonalität: • ähnliche Sprachkonstrukte sind ähnlich anwendbar • Optimierbarkeit: • Die Sprache besteht aus wenigen Operationen, für die es Optimierungsregeln gibt. • Effizienz: • Jede Operation ist effizient ausführbar • Sicherheit: • Keine Anfrage, die syntaktisch korrekt ist, darf in eine Endlosschleife geraten oder ein unendliches Ergebnis liefern. • Eingeschränktheit: • (folgt aus Sicherheit, Optimierbarkeit, Effizienz) • Die Anfragesprache darf keine komplette Programmiersprache sein.
3.2) XQuery - Einleitung • XML Query Language • Noch nicht als Empfehlung vom W3C verabschiedet • Mindestanforderungen (nach David Maier) • Selektion • anhand von Inhalt und Struktur • Extraktion und Reduktion • gezielte Extraktion von Subelementen, Löschen ausgewählter Subelemente • Kombination und Restrukturierung • Zusammenfassen von Elementen, Erzeugen neuer Elementmengen,...
XQuery - Basiskonstrukte • for - bindet Ausdrücke an Variablen • let - bindet Ausdrücke an Variablen • where - Einschränkung der Ergebnismenge durch Bedingungen • order by • return - Ergebniskonstruktion gesprochen Flower (in älteren Versionen: FLWR)
XQuery FLWOR-Ausdruck:= (for-Ausdruck | let-Ausdruck)+ where-Ausdruck? order-by-Ausdruck? return-Ausdruck Abbildung aus Schöning/Lehner: XQuery, dpunkt.Verlag, 2003
for/let-Klausel • Ermöglichen die Bindung von Ergebnissen beliebiger XQuery-Ausdrücke (im Allgemeinen Pfadausdrücke) an Variablen • for-Klausel: • Das Ergebnis des Ausdruckes wird elementweise an die Variable gebunden • Das nachfolgende Anfragekonstrukt wird für jedes Element einzeln ausgeführt • Bsp: for $b in fn:doc(„buecher.xml“)/buecher/buch (Anmerkung: fn:doc- Funktion zum Zugriff auf Datei) • let-Klausel: • Das Ergebnis des Ausdruckes wird vollständig als Sequenz von Knoten bzw. Werten an die Variable gebunden • Bsp: let $t := /buch/title let $x :=(<koordinaten/>)
for/let-Klausel let $x:= (<Informatik/>, <Wirtschaftsinformatik/>, <ITTI/>) return <teilnehmer> {$x}</teilnehmer> for $x in (<Informatik/>, <Wirtschaftsinformatik/>, <ITTI/>) return <teilnehmer> {$x}</teilnehmer> <teilnehmer> <Informatik/> <Wirtschaftsinformatik/> <ITTI/> </teilnehmer> <teilnehmer> <Informatik/> </teilnehmer> <teilnehmer> <Wirtschaftsinformatik/> </teilnehmer> <teilnehmer> <ITTI/> </teilnehmer>
for/let • Variablenbindung kann abhängig von anderen bereits gebundenen Variable sein for $b in fn:doc(„buecher.xml“)/buecher/buch let $t := $b/titel
where-Klausel • Bedingungen, die zur Filterung dienen, • Beispiele: • where $b/autor/text()=„Meyer“ • where $b/autor=„Meyer“ and contains($b/title/text(), „XML“) • where $b/year>2000 • where fn:count($b/autor)>3 • viele weitere Funktionen, zum Beispiel: • fn:avg, fn:min, fn:max, fn:sum, (auf numerischen Werten) • fn:concat, fn:substring (auf Strings) • fn:exacly-one, fn:zero, fn:exists (Kardinalität von Eingabesequenzen)
ORDER BY • Reihenfolge kann durch die order-by Klausel explizit erzwungen werden • order by $b/autor • stable order by $b/autor • bei Gleichheit der Werte (identischer Autor) wird die Reihenfolge aus dem Originaldokument gewählt • Weiterhin möglich: • empty greatest und • empty last nach der order by Klausel • (Hinweis: verschiedene Semantik von Nullwerten)
return • „Schablone“ zur Ergebniskonstruktion • Dereferenzierung von Variablen muss explizit angezeigt werden, eingeklammert {} • Der Rest wird direkt ausgegeben • Beispiel: • return <xmlbuch> {$t} {$a} </xmlbuch> • reines XML in der Anfragen wird so ins Ergebnis übernommen
Beispiel für geschachtelte XQuery-Anfragen • FLWR-Ausdrücke können geschachtelt werden for $x in /unterkuenfte return <ueberschrift> Hotels in Rostock </ueberschrift> <hotels> { for $h in $x/hotel where $h//ort[contains(text(),"Rostock")] return <eintrag> <hotelname>{$x/name/text()}</hotelname> <adresse> {$h/adresse/strasse} {$h/adresse/nummer} </adresse> </eintrag> } </hotels>
... das gleiche Beispiel <ueberschrift> Hotels in Rostock </ueberschrift> <hotels> { for $h in /unterkuenfte/hotel where $h//ort[contains(text(),"Rostock")] return <eintrag> <hotelname>{$h/name/text()}</hotelname> <adresse> {$h/adresse/strasse} {$h/adresse/nummer} </adresse> </eintrag> } </hotels>
XML-Updates • Ziel: Veränderung von XML-Dokumenten • noch nicht in XQuery enthalten • es gibt mehrere Vorschläge zur Erweiterung von XQuery für diese Aufgabe • Updates können • die Werte und • die Strukturinformationen • eines XML-Dokumentes verändern • Werden syntaktisch in XQuery-Statements eingebunden XML-Updates
Sprachvorschlag für Updates Nach Tatarinov: • DELETE child • Löscht den angegebenen Nachfolgerknoten des Kontextknotens • INSERT content [(BEFORE|AFTER) ref] • Erlaubt das Einfügen eines neuen Inhaltes neben dem Kontextknoten BEFORE/AFTER spezifiziert die Position • Sonst ergänzt INSERT nach dem letzten child-Knoten. • RENAME child TO name • Ordnet dem childknoten einen neuen Namen zu • REPLACE child WITH content • Ersetzt den child-Knoten durch den angegebenen Inhalt • (Operation kann auch durch 2 Operationen: INSERT BEFORE und DELETE ausgeführt werden.
Update von XML-Dokumenten,Veränderung von Inhalten (Daten) buecher • Anfragebeispiel (Tatarinov) for $x in document("buecher.xml"), $titel in $x/buch/titelwhere $titel="XML und Datenbanken"update $x{ replace $titel/text() with "XML und Datenbanken – Konzepte, Sprachen und Systeme"} buch isbn titel autor 3-89864-148-1 XML und Datenbanken XML und DB – Konzepte, Sprachen und Systeme Holger Meyer Elementknoten Textknoten Attributknoten
Update von XML-Dokumenten,Veränderung von Strukturen • Anfragebeispiel (Tatarinov) for $x in document("buecher.xml"), $autor in $x/buch/autorwhere $x/buch/@isbn=" 3-89864-189-9"update $x{ rename $autor TO "editor"} • beachtet werden muss u.a. • Gültigkeit der XML-Dokumente! buecher buch editor isbn titel autor 3-89864-189-9 Web und Datenbanken Erhard Rahm Elementknoten Textknoten Attributknoten
Literatur XML-Prozessoren: • Informationen über SAX: • www.saxproject.org • DOM: • www.w3.org/DOM-Level-1/ • www.w3.org/DOM-Level-2/ • www.w3.org/DOM-Level-3/ XPath, XQuery: • Schöning, Lehner: XQuery, dpunkt.verlag, 2004 • www.w3.org/TR/xpath • www.w3.org/XML/Query
Verfügbare Parser • An dieser Stelle sollen keine SAX- oder DOM-Prozessoren aufgezählt werden, da die Aussagen, was sie jeweils unterstützen, schnell veralten • viel verwendet wird: Xerces • (kommentierte) Softwaresammlungen unter: • xml.coverpages.org • www.xmlsoftware.com