How do I validate XML document using compact RELAX NG schema in Python?

Как проверить документ XML с помощью компактной схемы RELAX NG в Python?

3 ответа

Решение

Как насчет использования lxml?

Из документов:

>>> f = StringIO('''\
... <element name="a" xmlns="http://relaxng.org/ns/structure/1.0">
...  <zeroOrMore>
...     <element name="b">
...       <text />
...     </element>
...  </zeroOrMore>
... </element>
... ''')
>>> relaxng_doc = etree.parse(f)
>>> relaxng = etree.RelaxNG(relaxng_doc)

>>> valid = StringIO('<a><b></b></a>')
>>> doc = etree.parse(valid)
>>> relaxng.validate(doc)
True

>>> invalid = StringIO('<a><c></c></a>')
>>> doc2 = etree.parse(invalid)
>>> relaxng.validate(doc2)
False

Если вы хотите проверить синтаксис против синтаксиса Compact RelaxNG из командной строки, вы можете использовать pyjing из модуля jingtrang.

Он поддерживает файлы .rnc и отображает больше деталей, чем просто True или же False, Например:

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"

ПРИМЕЧАНИЕ: это оболочка Python для Java jingtrang поэтому требуется наличие Java.

Если вы хотите проверить синтаксис из Python, вы можете

  1. использование pytrang (все еще из обертки jingtrang): pytrang root.rnc root.rng

  2. использование lxml проанализировать root.rng следующим образом: https://lxml.de/validation.html

Это было бы что-то вроде этого:

>>> 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('<a><b></b></a>')
>>> doc = etree.parse(valid)
>>> relaxng.validate(doc)
True

>>> invalid = StringIO('<a><c></c></a>')
>>> doc2 = etree.parse(invalid)
>>> relaxng.validate(doc2)
False

Альтернативой использованию jingtrang или других внешних инструментов является использование библиотеки Python под названием rnc2rng. Это может загрузить файл в формате RNC, преобразовать его в формат XML ReleaxNG в виде строки, которую можно загрузить в класс RelaxNG lxml.

Подробности смотрите в этом выпуске .

Другие вопросы по тегам