Upload
lyphuc
View
221
Download
3
Embed Size (px)
Citation preview
Andreas Schmidt XPath / XQuery 1/31
Fakultät IWI
DB & IS II - WS2017
XML: Anfragen und Transformation
• XPath
• XQuery
Andreas Schmidt XPath / XQuery 3/31
Fakultät IWI
DB & IS II - WS2017
XPath
• Ausgangspunkt:
• Jedes XML Dokument hat Baumrepräsentation
• Aufgaben von XPath:
• Adressierung von Teilen eines XML-Dokuments
• Selektion von Knotenmengen
• Einschränkung der Knotenmenge durch Formulierung von Bedingungen
• Basiskonzept für weitere Technologien wie XSLT, XQuery, XPointer
• Grundlegenden Konzept: Pfadausdrücke mit zusätzlichen Bedingungen
• Beispiel (alle spanischen Städte mit mehr als 1 Mio Einwohner):
//country[name/text()='Spain']/city[population/text()>1000000]/name/text()
Andreas Schmidt XPath / XQuery 4/31
Fakultät IWI
DB & IS II - WS2017
XPath
• Beispieldokument:
<?xml version="1.0" encoding="UTF-8"?>
<Zoo>
<Tier art="Elefant" gewicht="500">
<Gehege>
<Ort>Eingang</Ort>
</Gehege>
<Pfleger>Sabine Sonnenschein</Pfleger>
<Pfleger>Susi Sorglos<Frei tag="Do"/>
</Pfleger>
</Tier>
<Tier art="Giraffe" gewicht="250">
<Gehege>
<Ort>Zentralpark</Ort>
</Gehege>
<Pfleger>Sarah Sonderbar</Pfleger>
</Tier>
<Tier art="Delphin" gewicht="80">
<Aquarium>
<Ort>Aquahouse</Ort>
</Aquarium>
<Pfleger>Sascha Sportlich<Frei tag="Mo"/>
</Pfleger>
</Tier>
</Zoo>
Tier Tier Tier
Gehege
Ort
Pfleger Pfleger
Frei
Zoo
Andreas Schmidt XPath / XQuery 5/31
Fakultät IWI
DB & IS II - WS2017
XPath
• Ein XPath-Ausdruck besteht aus einer Folge von Schritten
• Grobstruktur eines Xpath-Pfadausdrucks:/ Schritt_1 / Schritt_2 / ... / Schritt_n
• Jeder Schritt ist von der Bauart:
Achse::Knotentest [Auswahlbedingung]
Folie 6Folie 7 Folie 10
Andreas Schmidt XPath / XQuery 6/31
Fakultät IWI
DB & IS II - WS2017
XPath - Achsen
self
parent
child
descendant
ancestor
following
sibling
following
preceding
sibling
preceding attribute
ancestor-or-self := ancestor + self
descendant-or-self := descendant + self
Andreas Schmidt XPath / XQuery 7/31
Fakultät IWI
DB & IS II - WS2017
XPath - Knotentest
• Test auf den Namen eines Elementknotens
• <qname>: alle Knoten mit dem Bezeichner qname
• Test auf Typ des Knotens
• *: alle Elementknoten
• text(): alle Textknoten
• node(): alle Knoten (Element + Textknoten)
Wichtig: Groß/Kleinschreibung wird unterschieden !!!
Andreas Schmidt XPath / XQuery 8/31
Fakultät IWI
DB & IS II - WS2017
Abarbeiten eines XPath-Ausdrucks
• Startkontext ist Wurzelknoten:
• Für jeden Schritt im XPath-Ausdruck:
• Festlegung der Navigationsachse vom aktuellen Kontext aus (child, parent, sibling, attribute)
• Auswahl der Knoten entsprechend dem Knotentest
• optional: Einschränkung der zuvor ermittelten Knotenmenge durch zusätzliche Auswahlbedingung
• Knotenmenge bildet Kontext für nächsten Schritt
Andreas Schmidt XPath / XQuery 9/31
Fakultät IWI
DB & IS II - WS2017
XPath Beispiele
• Alle Pfleger
/descendant::Pfleger
• Alle Orte mit Gehegen
/descendant::Gehege/child::Ort
• Alle Elemente, die direkt unterhalb von Tier stehen können
/descendant::Tier/child::*
• Alle Elemente, die direkt oberhalb von Ort stehen können
/descendant::Ort/parent::*
• Alle Pfleger, die einen freien Tag haben
/descendant::Frei/parent::Pfleger
• Alle freien Tage (als Text) von Pflegern, die ein Tier in einem Aquarium betreuen
/descendant::Aquarium/following-sibling::Pfleger/child::Frei/
attribute::tag
Andreas Schmidt XPath / XQuery 10/31
Fakultät IWI
DB & IS II - WS2017
XPath - Prädikate
• Zusätzliche Einschränkung der Knotenmenge durch Formulierung zusätzlicher Bedingungen
(in [...])
• Beispiele:
• Alle Pfleger die Donnerstags frei haben:
/descendant::Frei[attribute::tag='Do']/parent::Pfleger
• Alle Tiere die im Aquahouse leben
/descendant::Tier[child::*/child::Ort/text()='Aquahouse']
• Alle Tiere zwischen 50 und 400 Kilo
/descendant::Tier[attribute::gewicht >= 50 and \
attribute::gewicht <= 400]
• Auswahl des n-ten Knoten (durch Indexoperator [index]1):
• Beispiel:die „Hauptpfleger“ jedes Tieres
/descendant::Tier/child::Pfleger[1]
1. Start bei Index 1
Andreas Schmidt XPath / XQuery 11/31
Fakultät IWI
DB & IS II - WS2017
XPath - Abkürzungen
Abkürzung Langform Bedeutung
tagname child::tagname alle Kindknoten, die tagname-Elemente sind
. self::node() der aktuelle Knoten
.. parent::node() der Elternknoten
@name attribut::name Attribut name des aktuellen Knotens
@* attribut::* alle Attribute des aktuellen Knotens
// descendent:: Wurzelknoten oder nachfolgende Knoten
Andreas Schmidt XPath / XQuery 12/31
Fakultät IWI
DB & IS II - WS2017
XPath Beispiele (Kurzform)
• Alle Pfleger die Donnerstags frei haben:
/descendant::Frei[attribute::tag='Do']/parent::Pfleger
//Frei[@tag='Do']/.. # nicht genau das selbe
# (evtl. gibt es tiere die frei haben) !!
• Alle Tiere die im Aquahouse leben
/descendant::Tier[child::*/child::Ort/text()='Aquahouse']
//Tier[*/Ort/text()='Aquahouse']
• Alle Tiere zwischen 50 und 400 Kilo
/descendant::Tier[attribute::gewicht >= 50 and \
attribute::gewicht <= 400]
//Tier[@gewicht >= 50 and @gewicht <= 400]
Andreas Schmidt XPath / XQuery 13/31
Fakultät IWI
DB & IS II - WS2017
XPath - Funktionen
Funktion Bedeutung
last() Position des letzten Elements
position() Kontextposition
sum(node-set) Summe der zu Zahlen umgewandelten Argumentknoten
count(node-set) Anzahl der Argumentknoten
name() Name des Argumentknoten
round(number) Runden von Zahlen
not(boolean) Negation eines boolschen Ausdrucks
contains(string1, string2) test ob string2 in string1 vorkommt
weiterhin werden mathematische Ausdrücke wie +, -, *, div, mod unterstützt
Andreas Schmidt XPath / XQuery 14/31
Fakultät IWI
DB & IS II - WS2017
XPath Übungen
• Fragen:
• Das vorletzte Tier im Zoo
• Alle Tiere mit ungerader Position (also das 1., das 3., das 5. etc.)
• Tiere mit mehr als einem Pfleger
• Wieviele Tiere gibt es im Zoo?
• Wieviel Pfund wiegt ein Delphin ?
• Welche Pfleger haben keinen freien Tag ?
• Antworten:
• //Tier[(last() – 1)]
• //Tier[(position() mod 2 = 1)]
• //Tier[count(Pfleger) > 1]
• count(//Tier) -- (nicht immer implementiert)
• //Tier[@art='Delphin']/@gewicht * 2
• //Pfleger[not(Frei)]/text()
Andreas Schmidt XPath / XQuery 16/31
Fakultät IWI
DB & IS II - WS2017
XQuery
• W3C Standard zur Abfrage an XML-Dokumente
• Dient der Extraktion von Informationen aus XML-Dokumenten
• Anfragen werden mittels XPath-Ausdrücken aufgebaut
• Erlaubt die Transformation von XML-Dokumenten
• Input: XML, Output: XML
• Ausdrücke sind schachtelbar
• Möglichkeiten:
• Verarbeitung von verschiedenen Quellen (XML-Dokumenten)
• Verbunde (Joins)
• Gruppierung
• Aggregation
• Sortierung
• Berechnungen
Andreas Schmidt XPath / XQuery 17/31
Fakultät IWI
DB & IS II - WS2017
XQuery
• FLWOR-Notation
• For-Klausel (n-Fach)
• Let.-Klausel (n-Fach)
• Where-Klausel
• Order-Klausel
• Return-Klausel
• Beispielanfrage:
Gib alle Länder mit mehr als 100 000 000 Millionen Ein-
wohnern absteigend sortiert nach Anzahl der Einwohner
aus:
for $c in doc("Laender.xml")/Laender/Land
let $name := $c/Name/text()
let $einwohner := xs:integer($c/Einwohner/text())
where $einwohner > 100000000
order by $einwohner descending
return <country id="{$c/@id}">
<population>{$einwohner}</population>
<name>{$name}</name>
</country>
Andreas Schmidt
Fakultät IWI
DB & IS II - WS2017
XPath / XQuery 18/31
XML-Beispieldokument 1
<?xml version="1.0" encoding="UTF-8"?>
<Laender>
<Land id="AL">
<Name>Albania</Name>
<Hauptstadt>Tirane</Hauptstadt>
<Einwohner>3249136</Einwohner>
</Land>
<Land id="AND">
<Name>Andorra</Name>
<Hauptstadt>Andorra la Vella</Hauptstadt>
<Einwohner>72766</Einwohner>
</Land>
<Land id="A">
<Name>Austria</Name>
<Hauptstadt>Vienna</Hauptstadt>
<Einwohner>8023244</Einwohner>
</Land>
<Land id="CZ">
<Name>Czech Republic</Name>
<Hauptstadt>Prague</Hauptstadt>
<Einwohner>10321120</Einwohner>
</Land>
<Land id="CH">
<Name>Switzerland</Name>
<Hauptstadt>Bern</Hauptstadt>
<Einwohner>7207060</Einwohner>
</Land>
<Land id="BY">
Andreas Schmidt
Fakultät IWI
DB & IS II - WS2017
XPath / XQuery 19/31
XML-Beispieldokument 2
<?xml version="1.0" encoding="UTF-8"?>
<Staedte>
<Stadt laendercode="CO">
<Name>Armenia</Name>
<Einwohner>220303</Einwohner>
</Stadt>
<Stadt laendercode="CR">
<Name>Liberia</Name>
<Einwohner>36400</Einwohner>
</Stadt>
<Stadt laendercode="AL">
<Name>Tirane</Name>
<Einwohner>192000</Einwohner>
</Stadt>
<Stadt laendercode="A">
<Name>Vienna</Name>
<Einwohner>1583000</Einwohner>
</Stadt>
<Stadt laendercode="BY">
<Name>Minsk</Name>
<Einwohner>1540000</Einwohner>
</Stadt>
<Stadt laendercode="B">
<Name>Brussels</Name>
<Einwohner>951580</Einwohner>
</Stadt>
<Stadt laendercode="BIH">
Andreas Schmidt XPath / XQuery 20/31
Fakultät IWI
DB & IS II - WS2017
XQuery: For-Klausel
• For-Klausel:
For ... in ...
Iteriert über die Sequenz, die sich aus der nach „in“ folgenden Quelle ergibt
Beispiele:
for $c in doc("...")//Land/Name/text()
return <name>{$c}</name>
• Ausgabe:
<name>Albania</name>
<name>Greece</name>
<name>Macedonia</name>
<name>Serbia and Montenegro</name>
<name>Andorra</name>
<name>France</name>
for $c in (7,3,65,5,7)
order by $c
return <x>{$c}</x>
• Ausgabe
<x>3</x>
<x>5</x>
<x>7</x>
<x>7</x>
<x>65</x>
Andreas Schmidt XPath / XQuery 21/31
Fakultät IWI
DB & IS II - WS2017
Let-Klausel:
• Aufgabe: Führt Wertezuweisung durch
let $var := <Ausdruck>
• Beispiel:
for $c in doc("laender.xml")//Land
let $id := $c/@id
let $name := $c/Name/text()
return <land id="{$id}">{$name}</land>
• Ausgabe:
<land id="AL">Albania</land>
<land id="GR">Greece</land>
<land id="MK">Macedonia</land>
<land id="YU">Serbia and Montenegro</land>
<land id="AND">Andorra</land>
<land id="F">France</land>
Andreas Schmidt XPath / XQuery 22/31
Fakultät IWI
DB & IS II - WS2017
Where-Klausel:
• Aufgabe: Selektiert Einträge
where <boolscher ausdruck>
• Beispiel:
for $c in doc("laender.xml")//Land
let $id := $c/@id
let $name := $c/Name/text()
where xs:integer($c/Einwohner/text()) > 100000000
return <land id="{$id}">{$name}</land>
• Ausgabe:
<land id="R">Russia</land>
<land id="TJ">China</land>
<land id="PK">Pakistan</land>
<land id="BD">Bangladesh</land>
<land id="IND">India</land>
<land id="RI">Indonesia</land>
Andreas Schmidt XPath / XQuery 23/31
Fakultät IWI
DB & IS II - WS2017
Order-Klausel:
• Beispiel:
for $c in doc("laender.xml")//Land
let $id := $c/@id
let $name := $c/Name/text()
let $einwohner := xs:integer($c/Einwohner/text())
where $einwohner > 100000000
order by $einwohner descending
return <land id="{$id}">{$c/Einwohner}<name>{$name}</name></land>
• Ausgabe:
<land id="IND">
<Einwohner>952107694</Einwohner>
<name>India</name>
</land>
<land id="USA">
<Einwohner>266476278</Einwohner>
<name>United States</name>
</land>
<land id="RI">
<Einwohner>206611600</Einwohner>
<name>Indonesia</name>
Element (mit Tags) aus $c
Andreas Schmidt XPath / XQuery 24/31
Fakultät IWI
DB & IS II - WS2017
geschachtelte for Schleife
xquery
for $c in ("a","b")
for $d in (1,2)
return <x>{$c}/{$d}</x>
/
• Ausgabe:
<x>a/1</x>
<x>a/2</x>
<x>b/1</x>
<x>b/2</x>
Andreas Schmidt XPath / XQuery 25/31
Fakultät IWI
DB & IS II - WS2017
Duplikatseliminierung
for $c in (1,1,2,3,3)
return <x>{$c}</x>
<?xml version="1.0"?>
<x>1</x>
<x>1</x>
<x>2</x>
<x>3</x>
<x>3</x>
for $c in distinct-values((1,1,2,3,3))
return <x>{$c}</x>
<?xml version="1.0"?>
<x>1</x>
<x>2</x>
<x>3</x>
Andreas Schmidt XPath / XQuery 26/31
Fakultät IWI
DB & IS II - WS2017
Schachtelung von XQuery Ausdrücken
let $n := 10
return <table>
{for $i in (1 to $n)
return <tr>{for $j in (1 to $n)
return <td>{$i *$j}</td>}</tr>}
</table>
• Ausgabe:
<table>
<tr>
<td>1</td> <td>2</td> ...<td>10</td>
</tr>
<tr>
<td>2</td> <td>4</td> ... <td>20</td>
</tr>
...
Andreas Schmidt XPath / XQuery 27/31
Fakultät IWI
DB & IS II - WS2017
Zugriff auf mehrere Quellen
for $i in doc("staedte.xml")//Stadt
let $land:= doc("laender.xml")//Land[@id=$i/@laendercode]
let $stadt_name := $i/Name/text()
let $land_name := $land/Name/text()
return <city name="{$stadt_name}" country="{$land_name}"/>
• Ausgabe
<city name="Tirane" country="Albania"/>
<city name="Vienna" country="Austria"/>
<city name="Minsk" country="Belarus"/>
...
Andreas Schmidt XPath / XQuery 28/31
Fakultät IWI
DB & IS II - WS2017
Funktionen in XQuery (1)
• numerische Funktionen:
abs($x), round($x), ceiling($x), floor($x), ...
• Zeichenkettenfunktionen
compare($str1, $str2), upper-case($str), contains($str1, $str2), starts-
with($str1, $str2), tokenize($input, $pattern), match($str, $regex),
concat($str1, $str2), substring-before($str1, $str2)*, ...
• Aggregatsfunktionen
count($seq), avg($seq), min($seq), max($seq), sum($seq)
• sonstige Funktionen
distinct-values($sequence), exists($arg), doc($filename), ...
• Typkonvertierungen
xs:integer($x), xs:float($x), xs:double($x), xs:date($x), xs:time($x), ...
(*) Zeichen aus $str1, die vor dem Auftreten von $str2 in $str1 stehen. Beispiel:(substring-before(’abcdefgh’,’def’) -> ’abc’
Andreas Schmidt XPath / XQuery 29/31
Fakultät IWI
DB & IS II - WS2017
Funktionen in XQuery (2)
• benutzerdefinierte Funktionen
declare function local:square($a as xs:integer) as xs:integer
{ let $c := $a * $a
return $c
};
for $i in (1 to 5)
return <x input="{$i}" square="{local:square($i)}" />
• Ausgabe:
<?xml version="1.0" encoding="UTF-8"?>
<x input="1" square="1"/>
<x input="2" square="4"/>
<x input="3" square="9"/>
<x input="4" square="16"/>
<x input="5" square="25"/>
Andreas Schmidt XPath / XQuery 30/31
Fakultät IWI
DB & IS II - WS2017
Literatur/Quellen
• XML-Tutorial:
• http://www.w3schools.com/xml/default.asp
• http://www.tutorial-project.de/suma/xml-tutorial.html
• XPath Tutorial: http://www.w3schools.com/xpath/
• XSLT Tutorial: http://www.w3schools.com/xsl/
• Online Buchauszug: Chapter 7: Transforming XML with XSLT
http://www.oreilly.com/catalog/orxmlapp/chapter/ch07.html
• XPathVisualizer: http://www.vbxml.com/xpathvisualizer/default.asp
• Einführung in XML, Erik T. Ray, O’Reilly Verlag, 2. Auflage April 2004, ISBN 3-89721-
370-2, 38.00 €
• XSLT. Doug Tidwell. März 2002. 478 Seiten. 40.00 €. O’Reilly.