Validierung zur Laufzeit
(Auszug aus "Python & XML" von Christopher A. Jones & Fred L. Drake, Jr.)
Eine Möglichkeit, XML-Dokumente zur Laufzeit in Python zu validieren, ist xmlproc mit seinen Callback-Schnittstellen und seiner Parser-API. Durch die Implementierung der ErrorHandler- bzw. DTDConsumer-Schnittstellen können Sie entsprechende Ereignisse über Gültigkeitsfehler im Dokument bzw. die DTD-Struktur abfangen.
Um Gültigkeitsfehler bei einem Dokument abzufangen, können Sie die Schnittstelle ErrorHandler implementieren und sie dem XMLValidator übergeben, alles Teile von xmlproc. Erzeugen Sie die Datei xpHandlers.py und fügen Sie die Klasse BadOrder ErrorHandler hinzu, wie im folgenden Beispiel gezeigt.
Beispiel: Eine BadOrderErrorHandler-Klasse implementiert ErrorHandler in xpHandlers.py
from xml.parsers.xmlproc.xmlapp import DTDConsumer
from xml.parsers.xmlproc.xmlapp import ErrorHandler
"""
BadOrderErrorHandler -- implementiert ErrorHandler-Schnittstelle aus xmlproc
"""
class BadOrderErrorHandler(ErrorHandler):
def warning(self,msg):
print "Warnung erhalten!:", msg
def error(self,msg):
print "Fehler erhalten!: ", msg
def fatal(self,msg):
print "Kritischen Fehler erhalten!: ", msg
Um Ereignisse abzufangen, die die Konstruktion der DTD selbst betreffen, können Sie die Schnittstelle DTDConsumer implementieren. Fügen Sie dazu die Klasse DTDHandler zur Datei xpHandlers.py hinzu, wie im folgenden Beispiel gezeigt.
Beispiel: Eine DTDHandler-Klasse implementiert DTDConsumer in xpHandlers.py
"""
DTDHandler -- implementiert DTDConsumer-Schnittstelle aus xmlproc
"""
class DTDHandler(DTDConsumer):
def __init__(self,parser):
self.parser=parser
def dtd_start(self):
print "Start der DTD..."
def dtd_end(self):
print "Ende der DTD..."
def new_general_entity(self,name,val):
print "Allgemeine Entity erhalten: ", name
def new_external_entity(self,ent_name,pub_id,sys_id,ndata):
print "Externe Entity erhalten: ", ent_name
def new_element_type(self,elem_name,elem_cont):
print "Neue Elementtyp-Deklaration: ", elem_name
print "Inhaltsmodell: ", elem_cont
def new_attribute(self,elem,attr,a_type,a_decl,a_def):
print "Neue Attribut-Deklaration: ", attr
Dieses Beispiel ist selbsterklärend. Jede Methode repräsentiert ein Ereignis beim Parsen der DTD. Ihre Methoden können diese Informationen abfangen und in jeder beliebigen Weise verwenden.
Bei der Implementierung der Schnittstellen wird die eigentliche Arbeit verrichtet. Um tatsächlich produktive Arbeit zu leisten und den validator zu benutzen, können Sie eine Instanz erzeugen, ihr Ihre Schnittstellenobjekte übergeben und sie auf eine bestimmte Ressource ansetzen. Die im nächsten Beispiel gezeigte Datei val.py enthält jenes bißchen Code, mit dem man ein Dokument parsen kann.
Beispiel: Kommandozeilen-Validierer (val.py)
""" XML-Validierung """
import sys
from xml.parsers.xmlproc import xmlval
from xpHandlers import BadOrderErrorHandler, DTDHandler
xv = xmlval.XMLValidator( )
dt = DTDHandler(xv.parser)
bh = BadOrderErrorHandler(xv.app.locator)
xv.set_error_handler(bh)
xv.set_dtd_listener(dt)
xv.parse_resource(sys.argv[1])
Sie können val.py aus der Kommandozeile benutzen, um zu sehen, ob XML-Dokumente den Gültigkeitstest hinsichtlich ihrer DTDs bestehen:
$ python val.py order.xml
Neue Elementtyp-Deklaration: customer_name
Inhaltsmodell: ('', [('#PCDATA', '')], '')
Neue Elementtyp-Deklaration: sku
Inhaltsmodell: ('', [('#PCDATA', '')], '')
Neue Elementtyp-Deklaration: qty C
Inhaltsmodell: ('', [('#PCDATA', '')], '')
Neue Elementtyp-Deklaration: unit_price
Inhaltsmodell: ('', [('#PCDATA', '')], '')
Neue Elementtyp-Deklaration: product_name
Inhaltsmodell: ('', [('#PCDATA', '')], '')
Neue Elementtyp-Deklaration: order
Inhaltsmodell: (',', [('customer_name', ''), ('sku', ''), ('qty', ''),
('unit_price', ''), ('product_name', '')], '')
Ende der DTD...
Dadurch, daß Sie den XMLValidator von xmlproc mit Handlern versorgen, können Sie die Informationen hinsichtlich der Gültigkeit des Dokuments abfangen und damit tun, was Sie möchten. Im nächsten Abschnitt ergänzen wir den Test um eine Validierung, indem wir ein Übersetzungs- und Validierungsbeispiel erstellen, das auf einem Webserver läuft.
<< 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