Übersetzen von XPath-Ausdrücken

(Auszug aus "Python & XML" von Christopher A. Jones & Fred L. Drake, Jr.)

In diesem Abschnitt benutzen wir die Funktion Evaluate aus der 4XPath-API, um XPath-Ausdrücke auf eine Knotenmenge anzuwenden. Für die programmatische Verwendung von XPath in Python ist die 4XPath-API bereits verfügbar und bietet beachtliche Möglichkeiten.

Das meiste in der XPath-API ist darauf ausgerichtet, XPath-Ausdrücke zu unterstützen, da XPath ein Standard ist. Für den Programmierer jedoch, der eine XPath-Verarbeitungsfunktionalität in seine Anwendungen einbetten möchte, gibt es in 4XPath einiges an Optimierungen.

Die Funktionen Compile und Context helfen dem Entwickler dabei, übersetzte XPath-Ausdrücke für die wiederholte Anwendung auf mehreren Dokumenten zu erzeugen. Wenn Sie z. B. große Mengen von XML-Dokumenten von Ihren Kunden oder Zulieferern erhalten, möchten Sie eventuell einen XPath-Ausdruck auf jedes davon (bei dessen Eintreffen) anwenden, um herauszufinden, was damit zu tun ist oder wohin es in Ihrer Organisation weitergeleitet werden soll. Wenn Sie dann Ihre bereits übersetzten XPath-Ausdrücke auf jedes einzelne Dokument anwenden können, wird Ihre Anwendung schneller, da Sie die XPath-Ausdrücke nicht mehr parsen müssen.

Die Funktion Compile gibt ein Ausdrucksobjekt zurück, das eine Methode namens evaluate unterstützt, die ähnlich zur bisher in diesem Abschnitt benutzten Funktion Evaluate ist. Allerdings erwartet die Methode ein Context-Objekt und keinen Knoten. Den Ausdruck zu übersetzen und dann die übersetzte Version zu verwenden ist relativ einfach:

expression = Compile("ship/@name")
context = Context(dom.documentElement)
nodes = expression.evaluate(context)

Der erste Schritt besteht darin, einen Ausdruck zu erzeugen, der zweite darin, den Kontext für das Dokument oder die Knotenmenge zu erzeugen, mit dem bzw. der Sie arbeiten. Sie können den Ausdruck ausführen, indem Sie die evaluate-Methode des über-setzten Ausdrucksobjekts aufrufen, wie im folgenden Beispiel gezeigt.

Beispiel: xp-2.py

#!/usr/local/bin/python

import sys

from xml.dom.ext.reader import PyExpat
from xml.xpath import Compile
from xml.xpath.Context import Context

reader = PyExpat.Reader( )
dom = reader.fromStream(sys.stdin)

expression = Compile("ship/@name")
context = Context(dom.documentElement)
nodes = expression.evaluate(context)

print "Knoten: ", nodes

Wenn das Programm mit ships.xml als Eingabe von der Kommandozeile ausgeführt wird, erzeugt es folgende Ausgabe:

$ python xp-2.py < ships.xml
Knoten: [<Attribute Node at a1cd9c: Name="name", Value="USS Enterprise">,
<Attribute Node at a2305c: Name="name", Value="USS Voyager">,
<Attribute Node at a2b7fc: Name="name", Value="USS Enterprise">,
<Attribute Node at a33fdc: Name="name", Value="USS Enterprise">,
<Attribute Node at a3a30c: Name="name", Value="USS Sao Paulo">]

Ihr Python- und XML-Werkzeugkasten ist nun fast komplett. In Transformation von XML mit XSLT untersuchen wir noch eine weitere Kerntechnologie. Danach besprechen wir Themen wie die Integration von XML in Ihre existierenden Systeme und wie man neue Systeme mit Python und XML baut.

  

<< zurück vor >>

 

 

 

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

Copyright © 2002 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 "Python & 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