如何在 Python 中通过紧凑的 RELAX NG 模式验证 XML 文档?
问问题
4025 次
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文件并显示更多详细信息,而不仅仅是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"
注意:它是 Java 的 Python 包装器,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
于 2018-12-24T03:33:41.480 回答