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! :(')
A little bit of OOP
为了验证多个文件,不需要每次都创建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
现在我们可以验证目录中的所有文件,如下所示:
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! :(')
7 回答
http://pyxb.sourceforge.net/处的PyXB包从XML模式文档生成Python的验证绑定 . 它几乎处理每个模式构造并支持多个名称空间 .
使用流行的库lxml在Python3中使用简单验证器的示例
Installation lxml
如果您收到类似"Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?"的错误,请先尝试执行此操作:
The simplest validator
让我们创造最简单的 validator.py
然后编写并运行 main.py
A little bit of OOP
为了验证多个文件,不需要每次都创建XMLSchema对象,因此:
validator.py
现在我们可以验证目录中的所有文件,如下所示:
main.py
有关更多选项,请阅读:Validation with lxml
至于“纯python”解决方案:包索引列表:
pyxsd,描述说它使用xml.etree.cElementTree,它不是"pure python"(但包含在stdlib中),但源代码表明它回退到xml.etree.ElementTree,所以这将算作纯python . 没有使用它,但根据文档,它确实进行了模式验证 .
minixsv:'a lightweight XML schema validator written in 371178 Python' . 但是,描述说"currently a subset of the XML schema standard is supported",所以这可能还不够 .
XSV,我认为它用于W3C的在线xsd验证器(它似乎仍然使用旧的pyxml包,我认为不再维护)
有两种方法(实际上还有更多)你可以做到这一点 .
1.使用lxml
pip install lxml
>> xmllint --format --pretty 1 --load-trace --debug --schema /path/to/my_schema_file.xsd /path/to/my_xml_file.xml
我假设你的意思是使用XSD文件 . 令人惊讶的是,没有很多python XML库支持这一点 . 然而,lxml确实如此 . 检查Validation with lxml . 该页面还列出了如何使用lxml来验证其他模式类型 .
lxml提供了etree.DTD
来自http://lxml.de/api/lxml.tests.test_dtd-pysrc.html的测试
您可以使用xmlschema Python package轻松地针对XML架构(XSD)验证XML文件或树 . 它是纯Python,可在PyPi上获得,并且没有很多依赖项 .
示例 - 验证文件:
如果文件未针对XSD进行验证,则该方法会引发异常 . 然后该异常包含一些违规细节 .
如果要验证许多文件,只需加载XSD一次:
如果您不需要例外,可以像这样验证:
或者,xmlschema直接用于文件对象和内存XML树(使用xml.etree.ElementTree或lxml创建) . 例: