31
Andreas Schmidt XPath / XQuery 1/31 Fakultät IWI DB & IS II - WS2017 XML: Anfragen und Transformation XPath XQuery

XML: Anfragen und · PDF file · 2017-12-09Andreas Schmidt XPath / XQuery 1/31 Fakultät IWI DB & IS II - WS2017 XML: Anfragen und Transformation • XPath • XQuery

  • 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 2/31

Fakultät IWI

DB & IS II - WS2017

XPath

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 15/31

Fakultät IWI

DB & IS II - WS2017

XQuery

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.

Andreas Schmidt XPath / XQuery 31/31

Fakultät IWI

DB & IS II - WS2017

Literatur/Quellen:

• XSLT Tutorial (1):

http://www.w3schools.com/xsl/

• XSLT-Tutorial (2):

http://www.zvon.org/xxl/XSLTutorial/Output/index.html

• XPATH-Tutorial:

http://www.zvon.org/xxl/XPathTutorial/General/examples.html