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.
Antworten
Zu viele Anzeigen?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.
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)