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:
[...]