3

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

4

2 回答 2

1

看起来目前不可能(libxml 2.8.0)。这取自 libxml 页面 ( xmlschemas ):

XML Schemas 处理和模式有效性检查的接口,目前还不完整。

作为一种解决方法,可以使用包含许多import元素的组合模式。可能会指定多余的名称空间。最后,组合模式必须显式传递给验证器。

导入的命名空间xsd:import使用目录正确解析,除非schemaLocationinimport指定有效的直接位置。

<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 回答