XML - Abfragesprache Xpath
Problemstellung Unsere XML-Datei steht und wir wollen alle 1. Titel aller vergangenen Sendungen automatisch aus den Playlists heraussuchen lassen. > Mit Xpath lässt sich diese Abfrage ausdrücken
Allgemeine Informationen Vom W3-Konsortium entwickelte Abfragesprache Dient der Abfrage von Teilen eines XML-Dokuments Dient als Grundlage für weitere Standards wie XSLT, Xpointer oder XQuery Xpath
Die Beispielauswahl mit Xpath ausgedrückt: /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel Alternative (Kurz-) Schreibweise (von denen es Unzählige gibt): /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel
Xpath Xpath durchläuft die XML-Datei entlang ihrer Baumstruktur Es gibt 7 Knotentypen (haben wir z.T. schon bei der XML-Einführung angesprochen): 1.Wurzel (= das oberstes Element) 2.Elemente 3.Attribute 4.Text (= der Inhalt zwischen den Tags) 5.Namensraum 6.Verarbeitungsanweisung (z.B. ) 7.Kommentare /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel
Xpath Genereller Aufbau eines Xpath-Ausdrucks Einer oder mehrere Lokalisierungsschritte (location steps), durch / voneinander getrennt. Diese bestehen aus zwei Teilen: 1.Der Achse (axis) 2.Dem Knotentest (node-test) Optional folgen ein oder mehrere Prädikate (predicates) Will man mehrere Xpath-Ausdrücke beliebig hintereinander schreiben, kann man sie mit dem Zeichen | verbinden. /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel
Xpath Achsen Die verschiedenen Achsenrichtungen geben an, in welche Richtung man sich in der Baumstruktur des Dokuments bewegt. (siehe: /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel koelnCampus sendung usw.
Xpath Beispiel für Achsenrichtung 1: child (Kindachse) Die Kindknoten unterhalb des aktuellen Knotens werden angesprochen /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel koelnCampus sendung usw.
Xpath Beispiel für Achsenrichtung 2: parent (Elternachse) Der Elternknoten des aktuellen Knotens wird angesprochen /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel koelnCampus sendung usw.
Xpath Beispiel für Achsenrichtung 3: descendant Sämtliche Nachkommen des aktuellen Knoten werden angesprochen /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel koelnCampus sendung usw.
Xpath Beispiel für Achsenrichtung 3: following-sibling Alle folgenden Geschwisterknoten werden angesprochen /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel koelnCampus sendung usw.
Xpath Knotentest In unserem Beispiel werden also jeweils immer die child-Achsen der entsprechenden Kontextknoten angesprochen (s.u.). Der Knotentest schränkt die Elementauswahl der Achse ein (z.B. hat sendung mehr Kinder als nur playlist, weswegen dessen Elementname angegeben wird), er wird mit zwei Doppelpunkten :: an die Achse angefügt Bei /child::koelnCampus/child::sendung/child::* würden hingegen alle child-Elemente von sendung ausgegeben werden. Das Zeichen * als Knotentest steht also für gib mir alle Achsen dieses Typs. /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel
Xpath Prädikate Mit Prädikaten lässt sich die Auswahl (nach dem Knotentest) weiter einschränken. Ein Prädikat ist in eckigen Klammern [] notiert und kann verschiedene Funktionen beinhalten. (siehe: In unserem Beispiel werden nur jene song-Knoten (->Knotentest) ausgewählt, bei denen das Attribut nr den Wert 1 besitzt (->Prädikat). /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel
Xpath Alternativen wären zum Beispiel alle songtitel ausser den ersten: /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr!=1]/child::songtitel Oder alle songtitel mit dem Attribut nr größer als 1 aber kleiner als 7: /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr>1][attribute::nr<7]/ch ild::songtitel Oder alle interpreten, die in playlists vorkommen, in denen weniger als 10mal das Element song vorkommt: /child::koelnCampus/child::sendung/child::playlist[count(./song)<10]/child::song/child::interpret /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel
Prädikate können allgemein drei Arten von Operatoren beinhalten: 1.Relationszeichen (=, !=,, =) 2.Mathematische Operatoren (+, -, /, *, Klammern, usw.) 3.Funktionen (z.B. die count()-Funktion von der Seite vorher) Xpath /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel
Xpath /child::koelnCampus/child::sendung/child::playlist/child::song[attribute::nr=1]/child::songtitel Ende