Man kann lxml
verwenden, um XML-Dateien für ein bestimmtes XSD-Schema zu validieren.Wie validiere ich ein XSD-Schema mit lxml, aber ignoriere Elemente, die einem bestimmten Muster entsprechen?
Gibt es eine Möglichkeit, diese Validierung in einem weniger strikten Sinn anzuwenden und alle Elemente zu ignorieren, die spezielle Ausdrücke enthalten?
Betrachten Sie das folgende Beispiel: Sagen Sie, ich habe eine xml_datei:
<foo>99</foo>
<foo>{{var1}}</foo>
<foo>{{var2}}</foo>
<foo>999</foo>
Nun, ich ein Programm ausführen zu dieser Datei, die die {{...}}
-expressions ersetzen und erzeugt eine neue Datei:
xml_file_new:
<foo>99</foo>
<foo>23</foo>
<foo>42</foo>
<foo>999</foo>
Bisher habe kann lxml
verwenden, um die neue XML-Datei zu validieren, wie folgt:
from lxml import etree
xml_root = etree.parse(xml_file_new)
xsd_root = etree.parse(xsd_file)
schema = etree.XMLSchema(xsd_root)
schema.validate(xml_root)
Der entsprechende Punkt in meinem Beispiel ist, dass das Schema der <foo>
Inhalte auf ganze Zahlen beschränkt.
wäre es nicht möglich sein, das Schema auf dem alten xml_file
im Voraus zu bewerben, aber, wie mein Programm einige andere teure Aufgaben tut, würde ich genau das tun, dass, während alle Zeilen werden ignoriert {{...}}
-expressions enthält:
<foo>99</foo> <!-- should be checked-->
<foo>{{var1}}</foo> <!-- should be ignored -->
<foo>{{var2}}</foo> <!-- should be ignored -->
<foo>999</foo> <!-- should be checked-->
EDIT: Möglicher Lösungsansatz: eine Idee wäre, zwei Schemata
- ein strenges zweites Schema für die neue Datei ermöglicht nur ganze Zahlen, definieren
- ein entspannendes Schema für die alte Datei, beiden ganzen Zahlen und beliebige Zeichenfolge mit
{{..}}
-expressions ermöglicht
jedoch der redundanten Aufgabe zu vermeiden, halten zwei Schema synchronisiert, würde man braucht eine Möglichkeit, die entspannten aus zu generieren das strenge Schema automatisch. Dies klingt sehr vielversprechend, da beide Schemata die gleiche Struktur haben, die sich nur in den Einschränkungen bestimmter Element-Inhalte unterscheiden. Gibt es ein einfaches Konzept, das von XSD angeboten wird, das es erlaubt, einfach von einem Schema zu "erben" und dann zusätzliche Entspannungen an einzelne Elemente anzuhängen?
Ich glaube nicht, dass dies möglich ist, ohne die XML oder das Schema zu ändern. Da Sie das XML nicht ändern können, können Sie das Schema ändern? Weil Sie einen Union-Typ für '' definieren könnten, der * entweder * ganze Zahlen * oder * '{{var ...}}' erlaubt. –
Meyer
Danke, ich habe es schon so gemacht. Allerdings möchte ich immer noch den strikten Integer-Check * nach * den Substitutionen und verbiete '{{...}}' -Ausdrücken verwenden. Die erste Überprüfung dient nur dazu, Probleme zu erkennen, um Zeit einzusparen, die zweite Prüfung ist wichtig. Um sicherzustellen, dass '{{var1}}' durch eine ganze Zahl in der neuen Datei ersetzt wird, müssen auch Fälle ausgeschlossen werden, in denen '{{var1}}' durch '{{var3}}' in der * neuen * Datei ersetzt wird . Hier würde das Verwenden des gleichen Schemas für beide Überprüfungen einen falschen positiven Wert ergeben. – flonk
Auf der anderen Seite befürchte ich, dass die Verwendung von zwei Schemata (eine entspannte erste und eine strengere zweite) viel Redundanz führt, besonders da ich das Schema sehr häufig ändern und aktualisieren muss. – flonk