Saltar al contenido

Validando con un esquema XML en Python

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *