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

Fundamental nature of xml namespaces and xsd validation

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

A:没有命名空间前缀 -

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

B:带有命名空间前缀 -

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

我想了解 A 和 B 之间的区别,因为即使它们在功能上看起来相同,但我知道它们并非如此。我感兴趣的是 "saying" 这两个不同的实例是什么 - someElement 元素与 [=] 上定义的名称空间的关系有何不同22=]someRoot元素,两个例子之间?

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

话虽如此,XML 社区普遍认为名称空间前缀是任意的,XML 文档的接收者应该接受它找到的任何前缀(或没有前缀,就像在你的第一个例子中一样),只要它绑定到正确的 URI,前缀的选择就不会传达任何信息。您可以看到这一点,例如在 W3C XML Infoset 规范中,它说(在 §2.2 中)"Note that namespace-aware applications should use the namespace name [*] rather than the prefix to identify elements."

这一共识反映在 XSD 规范中:模式验证忽略命名空间前缀。

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

[*] 规范使用 "namespace name" 来表示大多数人所说的 "namespace URI"。

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