如何在不明确指定架构文件的情况下验证 xml(使用 libxml)文件?xsd 文件位于 xml 文件的标头中。相应的 xsd 文件 URL 应位于使用 Catalog.xml 的本地文件系统中。
问问题
1092 次
2 回答
1
看起来目前不可能(libxml 2.8.0)。这取自 libxml 页面 ( xmlschemas ):
XML Schemas 处理和模式有效性检查的接口,目前还不完整。
作为一种解决方法,可以使用包含许多import
元素的组合模式。可能会指定多余的名称空间。最后,组合模式必须显式传递给验证器。
导入的命名空间xsd:import
使用目录正确解析,除非schemaLocation
inimport
指定有效的直接位置。
<import namespace="http://example.com"
schemaLocation="example.xsd">
如果example.xsd
当前目录中不存在,则使用目录文件解决。
于 2012-09-05T18:19:44.413 回答
1
我知道这是一个古老的问题,但是现在是 2021 年,一些政府才刚刚意识到整个互联网的事情。长话短说,他们使用 XML(是的,我知道)。
因此,模式验证是通过带有目录的 xsd 进行的,而 lxml 没有使用它。至少在 Windows 10 上的 2021 Python 3.9 上。相反,我发现从文件中导入可以在加载之前动态重写
所以我做了什么来解决它:
xmlschemadoc = etree.parse(xsd_file_with_imports)
for i in xmlschemadoc.findall(".//{http://www.w3.org/2001/XMLSchema}import"):
i.attrib['schemaLocation'] = convert_namespace_to_xsd_file(i.attrib['namespace'])
然后您可以使用架构:
xmlschema = etree.XMLSchema(xmlschemadoc)
xmlschema.assertValid(xml)
于 2021-01-08T09:48:05.583 回答