XML 有 "one schema rule" 吗?

Is there a "one schema rule" for XML?

我有一个 XML 文件,其中包含 14 个要验证的模式。所有模式都是独立的,不会相互导入,也没有任何链接所有模式的“超级模式”...

我能找到的所有在线/可下载工具都要求我上传我的 XML 文件,然后提供一个架构文件。

我只是想问,从 XML 标准的角度来看,我对架构的理解是否错误,它们都可以以某种方式用于一个文件?同样,管理我的 XML 文件的不同模式各自特定于它们的命名空间,并且没有继承或重用模式内的其他模式。

奇怪的是,即使是价值 100 美元的工具 (XmlBluePrint) 也只允许您使用一个模式文件进行验证...

另一方面,我知道 java 可以做到:

Schema schema = schemaFactory.newSchema(new Source[] {
            new StreamSource(new FileInputStream("main.xsd")),
            new StreamSource(new FileInputStream("extension.xsd")),
    });

但是我对Java没那么自信,可能是我没看懂?

你在两个方面都是正确的:

  1. XML 标准中的任何地方都没有“one schema rule for XML”:您可以验证一个XML 包含任意数量架构的文档。

  2. 工具几乎不支持为一个 XML 文档指定多个模式。即使是标准中的 xsi:noNamespaceSchemaLocationxsi:schemaLocation 提示也仅直接支持每个命名空间分别与单个 XSD 和单个 XSD 关联。

选项包括编写自定义代码或手动更改设置。

相关

  • How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?

术语:模式文档是 XSD 语法中包含源声明的文件。模式是通过编译一个或多个模式文档获得的模式组件的集合。如果您组合两个模式,结果就是一个模式。因此,您只会针对一个模式进行验证,但它可能源自多个模式文档,这些文档可能会或可能不会使用 xs:import/xs:include.

“链接”

当然有一些工具和 API 允许您 assemble 来自多个(非链接)模式文档的模式。例如,Saxon 命令行界面允许它:参见 http://www.saxonica.com/documentation/index.html#!schema-processing/commandline

但可能还有其他工具不允许这样做。