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

发布于 2024-12-13 08:41:20 字数 105 浏览 2 评论 0原文

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

How to validate xml (using libxml) file without specifying the schema file explicitly? xsd file is in the header of the xml file. The corresponding xsd file URL should be located in the local file system using a Catalog.xml.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

哭泣的笑容 2024-12-20 08:41:20

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

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

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

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

<import namespace="http://example.com"
          schemaLocation="example.xsd">

如果当前目录中不存在 example.xsd,则使用目录文件进行解析。

Looks like it is not possible at the moment (libxml 2.8.0). This is taken from libxml page (xmlschemas):

interface to the XML Schemas handling and schema validity checking, it
is incomplete right now.

As a workaround one may use a combined schema with lots of import elements. Superfluous namespaces may be specified. Finally the combined schema must be passed to the validator explicitly.

Namespaces imported with xsd:import are resolved correctly using catalogs, unless schemaLocation in import specifies valid direct location.

<import namespace="http://example.com"
          schemaLocation="example.xsd">

If example.xsd does not exist in current directory, it is resolved using catalog files.

淡莣 2024-12-20 08:41:20

我知道这是一个老问题,但现在已经是 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)

I know it's an old question however it's 2021 and some governments just woke up to the whole internet thing. Long story short they use XML (yeah I know).

So schema validation happens via xsd with a catalog and lxml didn't use it. At least on my 2021 Python 3.9 on Windows 10. Instead I found out that imports from within the files can be rewritten on the fly before loading

So what I did to fix it:

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'])

Then you can use the schema:

xmlschema = etree.XMLSchema(xmlschemadoc)
xmlschema.assertValid(xml)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文