使用架构标头和目录查找进行Xml验证

时间:2011-11-03 11:26:16

标签: xml libxml2 catalog

如何在不明确指定模式文件的情况下验证xml(使用libxml)文件? xsd文件位于xml文件的标头中。相应的xsd文件URL应使用Catalog.xml位于本地文件系统中。

2 个答案:

答案 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,则使用目录文件解析它。