Jon*_*ono 9 python xml lxml libxml2
根据lxml文档"DTD是根据解析文档的DOCTYPE自动检索的.您所要做的就是使用启用了DTD验证的解析器."
http://lxml.de/validation.html#validation-at-parse-time
但是,如果要对XML架构进行验证,则需要显式引用一个.
我想知道为什么这是,并想知道是否有一个库或函数可以做到这一点.或者甚至解释如何让自己发生这种情况.问题是似乎有很多方法可以引用XSD,我需要支持所有这些方法.
验证不是问题.问题是如何确定要验证的模式.理想情况下,这也可以处理内联模式.
更新:
这是一个例子.
simpletest.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="name" type="xs:string"/>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
simpletest.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<name xmlns="http://www.example.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org simpletest.xsd">foo</name>
Run Code Online (Sandbox Code Playgroud)
我想做类似以下的事情:
>>> parser = etree.XMLParser(xsd_validation=True)
>>> tree = etree.parse("simpletest.xml", parser)
Run Code Online (Sandbox Code Playgroud)
我的项目有 100 多个不同的模式和 xml 树。为了管理所有这些并验证它们,我做了一些事情。
1)我创建了一个文件(即 xmlTrees.py),在其中创建了每个 xml 和与其关联的相应架构以及 xml 路径的字典。这使我能够在一个地方获取 xml 和用于验证该 xml 的架构。
Run Code Online (Sandbox Code Playgroud)MY_XML = {'url':'/pathToTree/myTree.xml', 'schema':'myXSD.xsd'}
2)在项目中我们有同样多的命名空间(非常难以管理)。所以我所做的就是再次创建一个文件,其中包含 lxml 喜欢的格式的所有名称空间。然后在我的测试和脚本中,我总是传递命名空间的超集。
ALL_NAMESPACES = {
'namespace1': 'http://www.example.org',
'namespace2': 'http://www.example2.org'
}
Run Code Online (Sandbox Code Playgroud)
3)对于基本/通用验证,我最终创建了一个可以调用的基本函数:
def validateXML(content, schemaContent):
try:
xmlSchema_doc = etree.parse(schemaContent);
xmlSchema = etree.XMLSchema(xmlSchema_doc);
xml = etree.parse(StringIO(content));
except:
logging.critical("Could not parse schema or content to validate xml");
response['valid'] = False;
response['errorlog'] = "Could not parse schema or content to validate xml";
response = {}
# Validate the content against the schema.
try:
xmlSchema.assertValid(xml)
response['valid'] = True
response['errorlog'] = None
except etree.DocumentInvalid, info:
response['valid'] = False
response['errorlog'] = xmlSchema.error_log
return response
Run Code Online (Sandbox Code Playgroud)
基本上任何想要使用它的函数都需要将 xml 内容和 xsd 内容作为字符串发送。这为我提供了最大的灵活性。然后我只是将此函数放在一个文件中,其中包含所有 xml 辅助函数。