Haz todo lo posible por interpretar el código de forma correcta antes de aplicarlo a tu proyecto y si tdeseas aportar algo puedes decirlo en los comentarios.
Solución:
Supongo que te refieres a usar archivos XSD. Sorprendentemente, no hay muchas bibliotecas XML de Python que admitan esto. lxml lo hace sin embargo. Compruebe la validación con lxml. La página también enumera cómo usar lxml para validar con otros tipos de esquema.
En cuanto a las soluciones “pure python”: el índice del paquete enumera:
- pyxsd, la descripción dice que usa xml.etree.cElementTree, que no es “python puro” (pero está incluido en stdlib), pero el código fuente indica que recurre a xml.etree.ElementTree, por lo que esto contaría como python puro. No lo he usado, pero según los documentos, hace la validación del esquema.
- minixsv: ‘un validador de esquema XML ligero escrito en Python “puro”‘. Sin embargo, la descripción dice “actualmente se admite un subconjunto del estándar de esquema XML”, por lo que esto puede no ser suficiente.
- XSV, que creo que se usa para el validador xsd en línea del W3C (todavía parece usar el antiguo paquete pyxml, que creo que ya no se mantiene)
Un ejemplo de un validador simple en Python3 usando la popular biblioteca lxml
Instalación lxml
pip install lxml
Si obtiene un error como “No se pudo encontrar la función xmlCheckVersion en la biblioteca libxml2. ¿Está instalado libxml2?”, intenta hacer esto primero:
# Debian/Ubuntu
apt-get install python-dev python3-dev libxml2-dev libxslt-dev
# Fedora 23+
dnf install python-devel python3-devel libxml2-devel libxslt-devel
El validador más simple
Vamos a crear lo más simple validador.py
from lxml import etree
def validate(xml_path: str, xsd_path: str) -> bool:
xmlschema_doc = etree.parse(xsd_path)
xmlschema = etree.XMLSchema(xmlschema_doc)
xml_doc = etree.parse(xml_path)
result = xmlschema.validate(xml_doc)
return result
luego escribir y ejecutar principal.py
from validator import validate
if validate("path/to/file.xml", "path/to/scheme.xsd"):
print('Valid! :)')
else:
print('Not valid! :(')
Un poco de programación orientada a objetos
Para validar más de un archivo, no es necesario crear un Esquema XML objeto cada vez, por lo tanto:
validador.py
from lxml import etree
class Validator:
def __init__(self, xsd_path: str):
xmlschema_doc = etree.parse(xsd_path)
self.xmlschema = etree.XMLSchema(xmlschema_doc)
def validate(self, xml_path: str) -> bool:
xml_doc = etree.parse(xml_path)
result = self.xmlschema.validate(xml_doc)
return result
Ahora podemos validar todos los archivos en el directorio de la siguiente manera:
principal.py
import os
from validator import Validator
validator = Validator("path/to/scheme.xsd")
# The directory with XML files
XML_DIR = "path/to/directory"
for file_name in os.listdir(XML_DIR):
print(': '.format(file_name), end='')
file_path = '/'.format(XML_DIR, file_name)
if validator.validate(file_path):
print('Valid! :)')
else:
print('Not valid! :(')
Para más opciones, lea aquí: Validación con lxml
Más adelante puedes encontrar las referencias de otros sys admins, tú también eres capaz insertar el tuyo si lo crees conveniente.