我理解这是一个广泛的问题,但我想了解这两个实例在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 元素,两个例子之间?
答案 0 :(得分:1)
XML在定义“含义”(又称“语义”)方面不强。该规范的作者对此非常坚定:XML定义了一种富有表现力的语法,但它“意味着什么”是发送者和接收者达成一致的问题。
话虽如此,XML社区普遍认为名称空间前缀是任意的,XML文档的接收者应该接受它找到的任何前缀(或者没有前缀,如第一个例子中所示),并且因为它绑定到正确的URI,前缀的选择不传达任何信息。您可以看到这一点,例如在W3C XML Infoset规范中,它说(在§2.2中)“请注意,名称空间感知应用程序应该使用命名空间名称[*]而不是前缀来标识元素。”
此共识反映在XSD规范中:架构验证忽略了名称空间前缀。
在所有这些中,选择不使用名称空间前缀(<X xmlns="uri"/>
)是一种随意选择,就像选择特定前缀(<æ:X xmlns:æ="uri"/>
)一样。
[*]规范使用“名称空间名称”来表示大多数人称之为“名称空间URI”。
但是,您的两个示例之间存在一个区别,那就是选择前缀更重要。在第一个示例中,子元素someElement
具有命名空间名称(URI)http://myNamespace
。在第二个示例中,元素没有名称空间。这很重要(并且会影响架构验证);前缀的选择不是。