8

如何在 Python 中通过紧凑的 RELAX NG 模式验证 XML 文档?

4

2 回答 2

17

使用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
于 2009-08-10T13:46:26.593 回答
1

如果您想从命令行检查语法与Compact RelaxNG 语法,您可以使用jingtrang模块pyjing的 , 。

它支持.rnc文件并显示更多详细信息,而不仅仅是TrueFalse. 例如:

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"

注意:它是 Java 的 Python 包装器,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
于 2018-12-24T03:33:41.480 回答