xml 命名空间和 xsd 验证的基本性质



我知道这是一个广泛的问题,但我想了解这两个实例在 XSD 验证方面的含义的根本区别:

答:没有命名空间前缀 -

<someRoot xmlns="http://myNamespace">
<someElement>skjdhf</someElement>
</someRoot>

B:带命名空间前缀 -

<ns0:someRoot xmlns:ns0="http://myNamespace">
<someElement>skjdhf</someElement>
</ns0:someRoot>

我想了解A和B之间的区别,因为即使它们在功能上看起来等同,我知道它们不是。我感兴趣的是,两个实例"说"的不同之处是什么 -someElement元素与someRoot元素上定义的命名空间的关系在两个示例之间有何不同?

XML在定义"意义"(又名"语义"(方面并不强。该规范的作者对此非常坚定:XML定义了一种表达语法,但它的"含义"是发送方和接收方达成一致的问题。

话虽如此,XML 社区中有一个广泛的共识,即命名空间前缀是任意的,XML 文档的接收者应该接受它找到的任何前缀(或没有前缀,如您的第一个示例所示(,只要它绑定到正确的 URI,前缀的选择就不会传达任何信息。例如,您可以在 W3C XML 信息集规范中看到这一点,其中(在 §2.2 中("请注意,命名空间感知应用程序应使用命名空间名称 [*] 而不是前缀来标识元素。

此共识反映在 XSD 规范中:架构验证忽略命名空间前缀。

在所有这些中,选择不使用命名空间前缀(<X xmlns="uri"/>(是一个任意的选择,就像选择特定的前缀(<æ:X xmlns:æ="uri"/>(一样。

[*] 该规范使用"命名空间名称"作为大多数人所说的"命名空间 URI"。

但是,两个示例之间的一个区别比前缀的选择更重要。在第一个示例中,子元素someElement具有命名空间名称 (URI(http://myNamespace。在第二个示例中,元素不在命名空间中。这很重要(并且会影响架构验证(;前缀的选择不是。

最新更新