python xml python-2.7 xsd xml-validation

python - Validación del feed XML(.xsd) contra un esquema



python-2.7 xml-validation (2)

Tengo un archivo XML y tengo un esquema XML. Quiero validar el archivo contra ese esquema y verificar si se adhiere a eso. Estoy usando python, pero estoy abierto a cualquier idioma si no hay una biblioteca tan útil en python.

¿Cuáles serían mis mejores opciones aquí? Me preocuparía por la rapidez con la que puedo poner esto en marcha.


El fragmento de código de Python es bueno, pero una alternativa es usar xmllint:

xmllint -schema sample.xsd --noout sample.xml


Definitivamente lxml .

Defina un XMLParser con un esquema predefinido, cargue el archivo fromstring() y fromstring() cualquier error del esquema XML:

from lxml import etree def validate(xmlparser, xmlfilename): try: with open(xmlfilename, ''r'') as f: etree.fromstring(f.read(), xmlparser) return True except etree.XMLSchemaError: return False schema_file = ''schema.xsd'' with open(schema_file, ''r'') as f: schema_root = etree.XML(f.read()) schema = etree.XMLSchema(schema_root) xmlparser = etree.XMLParser(schema=schema) filenames = [''input1.xml'', ''input2.xml'', ''input3.xml''] for filename in filenames: if validate(xmlparser, filename): print("%s validates" % filename) else: print("%s doesn''t validate" % filename)

Nota sobre la codificación

Si el archivo de esquema contiene una etiqueta xml con una codificación (por ejemplo, <?xml version="1.0" encoding="UTF-8"?> ), El código anterior generará el siguiente error:

Traceback (most recent call last): File "<input>", line 2, in <module> schema_root = etree.XML(f.read()) File "src/lxml/etree.pyx", line 3192, in lxml.etree.XML File "src/lxml/parser.pxi", line 1872, in lxml.etree._parseMemoryDocument ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

Una solución es abrir los archivos en modo byte: open(..., ''rb'')

[...] def validate(xmlparser, xmlfilename): try: with open(xmlfilename, ''rb'') as f: [...] with open(schema_file, ''rb'') as f: [...]