3 Stimmen

Xml-Validierung mit Schemakopf und Katalogsuche

Wie kann man eine Xml-Datei (mit libxml) validieren, ohne die Schemadatei explizit anzugeben? Die xsd-Datei befindet sich in der Kopfzeile der Xml-Datei. Die entsprechende URL der xsd-Datei sollte im lokalen Dateisystem unter Verwendung einer Catalog.xml gefunden werden.

1voto

Jarekczek Punkte 6930

Sieht so aus, als wäre es im Moment nicht möglich (libxml 2.8.0). Dies ist von der libxml Seite ( xmlschemas ):

Schnittstelle zur Handhabung von XML-Schemas und zur Überprüfung der Schemagültigkeit, es ist im Moment noch unvollständig.

Als Abhilfe kann man ein kombiniertes Schema mit vielen import Elemente. Überflüssige Namespaces können angegeben werden. Schließlich muss das kombinierte Schema explizit an den Validator übergeben werden.

Namespaces, die mit xsd:import werden mit Hilfe von Katalogen korrekt aufgelöst, es sei denn schemaLocation en import gibt den gültigen direkten Standort an.

<import namespace="http://example.com"
          schemaLocation="example.xsd">

Si example.xsd im aktuellen Verzeichnis nicht vorhanden ist, wird sie mithilfe von Katalogdateien aufgelöst.

1voto

Ajay Punkte 161

Ich weiß, die Frage ist alt, aber wir schreiben das Jahr 2021 und einige Regierungen sind gerade erst aufgewacht und haben das Internet für sich entdeckt. Lange Rede, kurzer Sinn: Sie verwenden XML (ja, ich weiß).

Die Schema-Validierung erfolgt also über xsd mit einem Katalog, und lxml hat ihn nicht verwendet. Zumindest auf meinem 2021 Python 3.9 auf Windows 10. Stattdessen habe ich herausgefunden, dass Importe aus den Dateien vor dem Laden on the fly umgeschrieben werden können

Was ich also getan habe, um das Problem zu lösen:

xmlschemadoc = etree.parse(xsd_file_with_imports)
for i in xmlschemadoc.findall(".//{http://www.w3.org/2001/XMLSchema}import"):
    i.attrib['schemaLocation'] = convert_namespace_to_xsd_file(i.attrib['namespace'])

Dann können Sie das Schema verwenden:

xmlschema = etree.XMLSchema(xmlschemadoc)
xmlschema.assertValid(xml)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X