如何在不明确指定模式文件的情况下验证xml(使用libxml)文件? xsd文件位于xml文件的标头中。相应的xsd文件URL应使用Catalog.xml位于本地文件系统中。
答案 0 :(得分: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)
答案 1 :(得分:0)
目前看起来不可能(libxml 2.8.0)。这取自libxml页面(xmlschemas):
XML Schema处理和模式有效性检查的接口,它 现在还不完整。
作为解决方法,可以使用包含大量import
元素的组合架构。可以指定多余的命名空间。最后,必须明确地将组合模式传递给验证器。
使用目录正确解析了使用xsd:import
导入的命名空间,除非schemaLocation
中的import
指定了有效的直接位置。
<import namespace="http://example.com"
schemaLocation="example.xsd">
如果当前目录中不存在example.xsd
,则使用目录文件解析它。