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

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


person Epeli    schedule 10.08.2009    source источник
comment
возможный дубликат Проверка с помощью схемы XML в Python   -  person viam0Zah    schedule 26.11.2010
comment
@TörökGábor в этом вопросе не говорится о расслаблении   -  person oob    schedule 15.04.2012


Ответы (2)


Как насчет использования 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
person Maxim Sloyko    schedule 10.08.2009
comment
Спасибо! Хотя lxml не поддерживает компактный синтаксис, его можно преобразовать в xml с помощью Trang thaiopensource.com/relaxng /trang.html - person Epeli; 11.08.2009
comment
Есть ли способ получить полезную обратную связь, когда документ недействителен, а не просто False? - person Mads Skjern; 17.09.2012
comment
Если кто-нибудь приходит и доходит до этого момента и задается вопросом, есть ли ответ на предыдущий вопрос, ответ — да. Список проблем хранится в relaxng.error_log (в контексте приведенного выше кода). - person Michael Tiller; 17.03.2013
comment
Спасибо @MichaelTiller за error_log информацию. Во всяком случае, я обнаружил, что проверка lxml для RelaxNG довольно плохая - она ​​не обрабатывает ошибочную часть проверенного документа должным образом (отчетное местоположение xml: 1: 0 для всех ошибок). Его трудно сравнить с отчетом, предоставленным jing. - person Jan Vlcinsky; 05.10.2014
comment
@MaximSloyko Обратите внимание, что ваш вопрос спрашивает (внутри текста, а не в заголовке) о проверке с использованием схемы compact RELAX NG, и ответ показывает только вариант XML, так что это не ответ на ваш вопрос. - person Jan Vlcinsky; 06.05.2015

Если вы хотите сравнить синтаксис с синтаксисом 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) для преобразования "Compact RelaxNG" (.rnc) в XML RelaxNG (.rng): pytrang root.rnc root.rng

  2. Используйте lxml для анализа преобразованного файла .rng следующим образом: https://lxml.de/validation.html#relaxng

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

>>> 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
person Jean-Francois T.    schedule 24.12.2018