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