¿Cómo valido un documento XML utilizando el esquema compacto RELAX NG en Python?

¿Cómo valido un documento XML a través del esquema compacto RELAX NG en Python?

¿Qué hay de usar lxml ?

De los documentos:

>>> f = StringIO('''\ ...  ...  ...  ...  ...  ...  ...  ... ''') >>> relaxng_doc = etree.parse(f) >>> relaxng = etree.RelaxNG(relaxng_doc) >>> valid = StringIO('') >>> doc = etree.parse(valid) >>> relaxng.validate(doc) True >>> invalid = StringIO('') >>> doc2 = etree.parse(invalid) >>> relaxng.validate(doc2) False 

Si desea verificar la syntax frente a la syntax Compact RelaxNG desde la línea de comandos, puede usar pyjing , desde el módulo jingtrang .

Admite archivos .rnc y muestra más detalles que solo True o False . Por ejemplo:

 C:\>pyjing -c root.rnc invalid.xml C:\invalid.xml:9:9: error: element "name" not allowed here; expected the element end-tag or element "bounds" 

NOTA: es un envoltorio de Python del jingtrang Java, jingtrang lo que requiere tener instalado Java.

Si desea verificar la syntax desde Python, puede

  1. Utilice pytrang (aún de jingtrang wrapper): pytrang root.rnc root.rng

  2. Use lxml para analizar root.rng como este: https://lxml.de/validation.html#relaxng

Eso sería algo así:

 >>> from lxml import etree >>> from subprocess import call >>> call("pytrang root.rnc root.rng") >>> with open("root.rng") as f: ... relaxng_doc = etree.parse(f) >>> relaxng = etree.RelaxNG(relaxng_doc) >>> valid = StringIO('') >>> doc = etree.parse(valid) >>> relaxng.validate(doc) True >>> invalid = StringIO('') >>> doc2 = etree.parse(invalid) >>> relaxng.validate(doc2) False