Schematron-Validierung mit lxml in Python: Wie kann ich Validierungsfehler abrufen?

Ich versuche, eine Schematron-Validierung mit lxml zu machen. Für die spezifische Anwendung, an der ich arbeite, ist es wichtig, dass alle Tests, die die Validierung nicht bestanden haben, zurück gemeldet werden. In der lxml-Dokumentation wird das Vorhandensein des Eigenschaftenobjekts validation_report erwähnt. Ich denke, das sollte die Info enthalten, die ich suche, aber ich kann einfach nicht herausfinden, wie die Arbeit damit funktioniert. Hier ist ein Beispielcode, der mein Problem demonstriert (angepasst von http://lxml.de/validation.html#id2 ; getestet mit Python 2.7.4):

 import StringIO from lxml import isoschematron from lxml import etree def main(): # Schema f = StringIO.StringIO('''\ <schema xmlns="http://purl.oclc.org/dsdl/schematron" > <pattern id="sum_equals_100_percent"> <title>Sum equals 100%.</title> <rule context="Total"> <assert test="sum(//Percent)=100">Sum is not 100%.</assert> </rule> </pattern> </schema> ''') # Parse schema sct_doc = etree.parse(f) schematron = isoschematron.Schematron(sct_doc, store_report = True) # XML to validate - validation will fail because sum of numbers # not equal to 100 notValid = StringIO.StringIO('''\ <Total> <Percent>30</Percent> <Percent>30</Percent> <Percent>50</Percent> </Total> ''') # Parse xml doc = etree.parse(notValid) # Validate against schema validationResult = schematron.validate(doc) # Validation report (assuming here this is where reason # for validation failure is stored, but perhaps I'm wrong?) report = isoschematron.Schematron.validation_report print("is valid: " + str(validationResult)) print(dir(report.__doc__)) main() 

Nun, aus dem Wert von validationResult kann ich sehen, dass die Validierung fehlgeschlagen ist (wie erwartet), also als nächstes möchte ich wissen, warum . Das Ergebnis der zweiten Druckaussage gibt mir:

 ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__get slice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mo d__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook __', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index ', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', ' rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', ' strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] 

Was ist so weit wie ich bin, basiert auf der Dokumentation und diese Frage Frage . Könnte wohl etwas ganz offensichtliches sein, das ich übersehen werde?

  • Schematron report Ausgabe mit python lxml
  • One Solution collect form web for “Schematron-Validierung mit lxml in Python: Wie kann ich Validierungsfehler abrufen?”

    OK, so dass jemand auf Twitter gab mir einen Vorschlag, der mir klar, dass ich irrtümlich bekam den Hinweis auf die schematron Klasse alle falsch. Da gibt es keine klaren Beispiele, ich teile meine Arbeitslösung unten:

     import StringIO from lxml import isoschematron from lxml import etree def main(): # Example adapted from http://lxml.de/validation.html#id2 # Schema f = StringIO.StringIO('''\ <schema xmlns="http://purl.oclc.org/dsdl/schematron" > <pattern id="sum_equals_100_percent"> <title>Sum equals 100%.</title> <rule context="Total"> <assert test="sum(//Percent)=100">Sum is not 100%.</assert> </rule> </pattern> </schema> ''') # Parse schema sct_doc = etree.parse(f) schematron = isoschematron.Schematron(sct_doc, store_report = True) # XML to validate - validation will fail because sum of numbers # not equal to 100 notValid = StringIO.StringIO('''\ <Total> <Percent>30</Percent> <Percent>30</Percent> <Percent>50</Percent> </Total> ''') # Parse xml doc = etree.parse(notValid) # Validate against schema validationResult = schematron.validate(doc) # Validation report report = schematron.validation_report print("is valid: " + str(validationResult)) print(type(report)) print(report) main() 

    Die Druckaussage auf dem Bericht ergibt nun folgende Ausgabe:

      <?xml version="1.0" standalone="yes"?> <svrl:schematron-output xmlns:svrl="http://purl.oclc.org/dsdl/svrl" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:schold="http://www.ascc.net/xml/schematron" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:iso="http://purl.oclc.org/dsdl/schematron" title="" schemaVersion=""> <!-- --> <svrl:active-pattern id="sum_equals_100_percent" name="Sum equals 100%."/> <svrl:fired-rule context="Total"/> <svrl:failed-assert test="sum(//Percent)=100" location="/Total"> <svrl:text>Sum is not 100%.</svrl:text> </svrl:failed-assert> </svrl:schematron-output> 

    Was genau das war, was ich gesucht habe!

    Python ist die beste Programmiersprache der Welt.