用Python中的XML模式进行validation
我在另一个文件中有一个XML文件和一个XML模式,我想validation我的XML文件是否符合模式。 我如何在Python中做到这一点?
我更喜欢使用标准库的东西,但是如果需要,我可以安装第三方软件包。
我假设你的意思是使用XSD文件。 令人惊讶的是没有太多的Python XML库支持这一点。 lxml不过。 用lxml检查validation 。 该页面还列出了如何使用lxml与其他模式types进行validation。
至于“纯python”解决scheme:软件包索引列表:
- pyxsd ,描述说它使用了xml.etree.cElementTree,它不是“纯粹的python”(但包含在stdlib中),但源代码指出它退回到xml.etree.ElementTree,所以这将被视为纯python。 没有使用它,但根据文档,它确实做架构validation。
- minixsv :“一个用”纯Python“编写的轻量级XML模式validation器。 但是,描述中提到“目前支持XML模式标准的一个子集”,所以这可能是不够的。
- XSV ,我认为是用于W3C的在线xsdvalidation器(它似乎仍然使用旧的pyxml包,我认为不再维护)
http://pyxb.sourceforge.net/上的PyXB软件包从XML模式文档生成Pythonvalidation绑定。; 它几乎处理每个模式构造,并支持多个名称空间。
lxml提供了etree.DTD
从http://lxml.de/api/lxml.tests.test_dtd-pysrc.html上的testing
... root = etree.XML(_bytes("<b/>")) dtd = etree.DTD(BytesIO("<!ELEMENT b EMPTY>")) self.assert_(dtd.validate(root))
有两种方法(实际上有更多),你可以做到这一点。
1.使用lxml
pip install lxml
from lxml import etree, objectify from lxml.etree import XMLSyntaxError def xml_validator(some_xml_string, xsd_file='/path/to/my_schema_file.xsd'): try: schema = etree.XMLSchema(file=xsd_file) parser = objectify.makeparser(schema=schema) objectify.fromstring(some_xml_string, parser) print "YEAH!, my xml file has validated" except XMLSyntaxError: #handle exception here print "Oh NO!, my xml file does not validate" pass xml_file = open('my_xml_file.xml', 'r') xml_string = xml_file.read() xml_file.close() xml_validator(xml_string, '/path/to/my_schema_file.xsd')
- 从命令行使用xmllint 。 xmllint安装在许多Linux发行版中。
>> xmllint --format --pretty 1 --load-trace --debug --schema /path/to/my_schema_file.xsd /path/to/my_xml_file.xml
在Python3中使用stream行的库lxml的一个简单的validation器的例子
安装lxml
pip install lxml
如果遇到如下错误: “libxml2库中找不到函数xmlCheckVersion,是否安装了libxml2? ,首先尝试这样做:
# Debian/Ubuntu apt-get install python-dev python3-dev libxml2-dev libxslt-dev # Fedora 23+ dnf install python-devel python3-devel libxml2-devel libxslt-devel
最简单的validation器
我们来创build一个最简单的validator.py
from lxml import etree def validate(xml_path: str, xsd_path: str) -> bool: xmlschema_doc = etree.parse(xsd_path) xmlschema = etree.XMLSchema(xmlschema_doc) xml_doc = etree.parse(xml_path) result = xmlschema.validate(xml_doc) return result
然后编写并运行main.py
from validator import validate if validate("path/to/file.xml", "path/to/scheme.xsd"): print('Valid! :)') else: print('Not valid! :(')
一点OOP
为了validation多个文件,每次都不需要创build一个XMLSchema对象,因此:
validator.py
from lxml import etree class Validator: def __init__(self, xsd_path: str): xmlschema_doc = etree.parse(xsd_path) self.xmlschema = etree.XMLSchema(xmlschema_doc) def validate(self, xml_path: str) -> bool: xml_doc = etree.parse(xml_path) result = self.xmlschema.validate(xml_doc) return result
现在我们可以validation目录中的所有文件,如下所示:
main.py
import os from validator import Validator validator = Validator("path/to/scheme.xsd") # The directory with XML files XML_DIR = "path/to/directory" for file_name in os.listdir(XML_DIR): print('{}: '.format(file_name), end='') file_path = '{}/{}'.format(XML_DIR, file_name) if validator.validate(file_path): print('Valid! :)') else: print('Not valid! :(')
有关更多选项,请阅读此处: 使用lxml进行validation
如果你正在使用dtd,你可能会喜欢这个食谱
- 如何在由@Html助手生成的MVC中更改“data-val-number”消息validation
- MVCdate时间validation – 英国date格式
- Python urllib2,基本的HTTPauthentication和tr.im
- 用于PHP的最简单的表单validation库?
- Html.ValidationSummary(false,“message”)总是显示,即使在页面加载
- 禁用HTML5表单元素的validation
- 在回发上,我如何添加错误消息到validation摘要?
- 覆盖HTML5表单validation/所需的popup窗口的CSS
- WPF DataBinding:可空的Int仍然得到validation错误?