为什么 xmlns:xsi,而不仅仅是 XML 文件中的 xsi?

Why xmlns:xsi, and not only xsi in XML documents?

我了解到,按照惯例,默认命名空间在 XML 文档的根元素中被命名为 xmlns 属性。其他名称空间被命名为其他名称。现在,我想知道为什么 XML Scheme Instance 命名空间总是命名为 xmlns:xsi 而不是简单地命名为 xsixsi 会和 xmlns:xsi 一样吗?如果是,为什么是?如果没有,为什么没有?

不是来自默认命名空间的元素和属性名称始终以命名空间的名称开头。 xmlns:xsi 告诉我 xsi 是命名空间 xmlns 中定义的属性,这是冲突的,因为默认命名空间中的属性名称不应以命名空间开头。

默认命名空间未命名为 xmlns

xmlns 是声明命名空间 prefix 的方式(即简称,句柄)。语法是 xmlns[:prefix]="namepace-uri".

每个 XML 元素只能有一个命名空间声明,您可以在其中省略前缀 (xmlns="namespace-uri"),如果以这种方式声明,则称为 默认命名空间.

它被称为 default 因为所有未明确覆盖它的后代元素都将继承它 - 这里 <element><child> 和第一个 <grandchild> 都是 some_namespace 的一部分:

<element xmlns="some_namespace">
  <child>
    <grandchild />
    <grandchild xmlns="something_else" />
    <yan:grandchild xmlns:yan="yet_another_namespace" />
  </child>
</element>

这种自动继承不会与前缀一起发生 - 这里,只有 <sn:element>some_namespace 中,因此与上面的 <element> 相同,而 <child> 和第一个 <grandchild> 不在命名空间中:

<sn:element xmlns:sn="some_namespace">
  <child>
    <grandchild />
    <grandchild xmlns="something_else" />
    <yan:grandchild xmlns:yan="yet_another_namespace" />
  </child>
</sn:element>

重要的部分只是命名空间 URI,而不是前缀:

  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 声明 URI http://www.w3.org/2001/XMLSchema-instance 在该元素内应称为 xsi

  • 你可以自由选择你喜欢的任何前缀,你可以声明xmlns:bob="http://www.w3.org/2001/XMLSchema-instance",这意味着URI http://www.w3.org/2001/XMLSchema-instance 应该在里面被称为bob这个元素。

按照惯例,许多广泛使用的 XML 命名空间 URI 在任何地方都有相同的前缀,但这在技术上不是必需的。