XML::XPath

(Auszug aus "Perl & XML" von Erik T. Ray & Jason McIntosh)

Wir haben nun einige Beispiele von Parsern gesehen, die brav ihre Pflicht erfüllen, indem sie uns das gesamte Dokument übergeben. In vielen Fällen interessiert uns aber gar nicht das komplette Dokument. Wenn man eine Datenbank abfragt, dann interessiert einen oft nur eine einzige Zeile aus einer bestimmten Tabelle. Wenn Sie ein Telefonbuch aufschlagen, dann werden Sie sich wohl kaum damit beschäftigen, es zu lesen. Offensichtlich gibt es das Bedürfnis, spezielle Informationen aus einem Dokument zu extrahieren. Dafür gibt es XPath.

XPath ist eine weitere Empfehlung des W3C. In diesem Fall handelt es sich um eine Grammatik für formale Ausdrücke, mit denen bestimmte Teile eines beliebigen Dokuments identifiziert werden. Stellen Sie sich ein Schema zur Vergabe von Adressen vor. Obwohl wir uns die Einzelheiten des Umgangs mit XPath für Arbeit mit Bäumen: XPath, XSLT und mehr aufheben, wollen wir einstweilen einmal verraten, daß es eine Art Mixtur aus regulären Ausdrücken und Dateipfadnamen im Stil von Unix ist. Offensichtlich macht es das zu einem attraktiven Feature, das man in Parser einbauen kann.

Das Modul XML::XPath von Matt Sergeant ist eine auf XML::Parser aufbauende XPath-Implementierung. Gibt man dem Modul einen XPath-Ausdruck, erhält man als Ergebnis alle Teile des Dokuments, auf die die Beschreibung paßt. Das ist eine unglaublich einfache Möglichkeit, um auf mächtige Suchfunktionen und die gefundenen Daten zuzugreifen.

Nehmen wir als Beispiel das folgende Adreßbuch in XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<kontakte>
  <adresse>
    <name>Bob Snob</name>
    <strasse>Krösusallee 123</strasse>
    <stadt>Entenhausen</stadt>
    <plz>12345</plz>
  </adresse>
  <!-- Weitere Adressen folgen hier. -->
</kontakte>

Die Aufgabe besteht darin, alle Postleitzahlen herauszugreifen und in einer Liste auszugeben. Das Beispiel unten zeigt, wie man das in XPath formulieren kann.

Beispiel: Ausgabe von Postleitzahlen

use XML::XPath;

my $file = 'kontakte.xml';
my $xp = XML::XPath->new(filename=>$file);

# Eine Knotenmenge von XML::XPath ist ein Objekt, das das Ergebnis
# der Anwendung eines XPath-Ausdrucks auf ein XML-Dokument enthält.
# Wir formulieren den Ausdruck und schauen, was dabei herauskommt.
my $nodeset = $xp->find('//plz');

my @zipcodes; # Ausgabe der Ergebnisse
if (my @nodelist = $nodeset->get_nodelist) {
   # Postleitzahlen wurden gefunden! Jeder Knoten ist ein Objekt der Klasse
   # XML::XPath::Node::Element. Diese Klasse besitzt eine Methode 'string_value',
   # mit der wir den darin enthaltenen Text extrahieren und ausgeben können.
   # Das tun wir für alle gefundenen Knoten.
   @zipcodes = map($_->string_value, @nodelist);
   
   # Wir sortieren die Postleitzahlen.
   @zipcodes = sort(@zipcodes);
   
   local $" = "\n";
   print "Die folgenden Postleitzahlen wurden gefunden:\n@zipcodes\n";
} else {
   print "Die Datei $file enthält keine 'plz'-Elemente!\n";
}   

Wenn wir das Programm auf einer Datei mit drei Adressen ausführen, erhalten wir in etwa die folgende Ausgabe:

Die folgenden Postleitzahlen wurden gefunden:
70565
72800
72555

Nebenbei bemerkt demonstriert dieses Modul ein weiteres Beispiel von baumorientierter XML-Verarbeitung. Der Parser lädt das Dokument in einen speziellen Objektbaum. Der Benutzer kann dann mit diesem Objektbaum in Interaktion treten, indem er durch XPath-Ausdrücke bestimmte Teile extrahiert. Das ist nur ein Beispiel, was man mit fortgeschrittener baumorientierter Technik alles erreichen kann. Wir werden in Arbeit mit Bäumen: XPath, XSLT und mehr noch mehr davon sehen.

Die Elementobjekte des Moduls XML::LibXML besitzen eine Methode findnodes( ), die ganz ähnlich arbeitet wie die Methode find( ) von XML::XPath. Das aufrufende Element wird als aktueller Kontextknoten verwendet, und das Ergebnis ist eine Liste von Objekten, die der Query entsprechen. Mit dieser Funktionalität werden wir uns noch in Strategien des Programmierers beschäftigen.

  

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Perl & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Perl & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de