Tengo un archivo XML y un esquema XML en otro archivo y me gustaría validar que mi archivo XML se adhiera al esquema. ¿Cómo hago esto en Python?
Preferiría usar la biblioteca estándar, pero puedo instalar un paquete de terceros si es necesario.
python
xml
validation
xsd
Eli Courtwright
fuente
fuente
En cuanto a las soluciones de "python puro": el índice del paquete enumera:
fuente
Un ejemplo de un validador simple en Python3 usando la popular biblioteca lxml
Instalación lxml
Si recibe un error como "No se pudo encontrar la función xmlCheckVersion en la biblioteca libxml2. ¿Está libxml2 instalado?" , intenta hacer esto primero:
El validador más simple
Creemos el validator.py más simple
luego escribe y ejecuta main.py
Un poco de OOP
Para validar más de un archivo, no es necesario crear un objeto XMLSchema cada vez, por lo tanto:
validator.py
Ahora podemos validar todos los archivos en el directorio de la siguiente manera:
main.py
Para más opciones lea aquí: Validación con lxml
fuente
El paquete PyXB en http://pyxb.sourceforge.net/ genera enlaces de validación para Python a partir de documentos de esquema XML. Maneja casi todas las construcciones de esquemas y admite múltiples espacios de nombres.
fuente
Hay dos formas (en realidad, hay más) de hacer esto.
1. usando lxml
pip install lxml
>> xmllint --format --pretty 1 --load-trace --debug --schema /path/to/my_schema_file.xsd /path/to/my_xml_file.xml
fuente
Puede validar fácilmente un archivo o árbol XML con un esquema XML (XSD) con el paquete xmlschema Python . Es Python puro, disponible en PyPi y no tiene muchas dependencias.
Ejemplo: validar un archivo:
El método genera una excepción si el archivo no se valida con el XSD. Esa excepción luego contiene algunos detalles de la infracción.
Si desea validar muchos archivos, solo tiene que cargar el XSD una vez:
Si no necesita la excepción, puede validar de esta manera:
Alternativamente, xmlschema trabaja directamente en objetos de archivo y en árboles XML de memoria (ya sea creados con xml.etree.ElementTree o lxml). Ejemplo:
fuente
lxml proporciona etree.DTD
de las pruebas en http://lxml.de/api/lxml.tests.test_dtd-pysrc.html
fuente