xml名称空间和xsd验证的基本特性

时间:2018-05-31 09:15:41

标签: xml xml-namespaces

我理解这是一个广泛的问题,但我想了解这两个实例在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 元素,两个例子之间?

1 个答案:

答案 0 :(得分:1)

XML在定义“含义”(又称“语义”)方面不强。该规范的作者对此非常坚定:XML定义了一种富有表现力的语法,但它“意味着什么”是发送者和接收者达成一致的问题。

话虽如此,XML社区普遍认为名称空间前缀是任意的,XML文档的接收者应该接受它找到的任何前缀(或者没有前缀,如第一个例子中所示),并且因为它绑定到正确的URI,前缀的选择不传达任何信息。您可以看到这一点,例如在W3C XML Infoset规范中,它说(在§2.2中)“请注意,名称空间感知应用程序应该使用命名空间名称[*]而不是前缀来标识元素。”

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

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

[*]规范使用“名称空间名称”来表示大多数人称之为“名称空间URI”。

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