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

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 existe 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.

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 encoding

Si el archivo de esquema contiene una etiqueta xml con una encoding (por ejemplo, ), El código anterior generará el siguiente error:

 Traceback (most recent call last): File "", line 2, in  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: [...] 

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

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