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

时间:2009-08-10 13:33:51

标签: python xml relaxng

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

2 个答案:

答案 0 :(得分:16)

如何使用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

答案 1 :(得分:0)

如果要通过命令行检查语法和 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 jingtrang的Python包装器,因此需要安装Java。

如果要在Python中检查语法,可以

  1. 使用pytrang(仍然来自 jingtrang 包装器): pytrang root.rnc root.rng

  2. 使用lxml来解析 root.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