456

我在 XML 文件中看到以下行:

xmlns:android="http://schemas.android.com/apk/res/android"

我还在xmlns我遇到的许多其他 XML 文件中看到过。

它是什么?

4

5 回答 5

731

这意味着XML 命名空间

基本上,XML中的每个元素(或属性)都属于一个名称空间,这是一种“限定”元素名称的方式。

想象一下,你和我都发明了我们自己的 XML。你发明 XML 来描述人,我发明我的来描述城市。我们俩都包含一个名为name. 你的指的是这个人的名字,我的指的是城市名称——好吧,有点做作。

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

如果我们的两个 XML 组合成一个文档,我们如何区分这两个名称?正如您在上面看到的,有两个name元素,但它们都有不同的含义。

答案是你和我都会为我们的 XML 分配一个命名空间,我们将使其独一无二:

<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
                  xmlns:cityxml="http://www.my.example.com/xml/cities">
    <personxml:name>Rob</personxml:name>
    <personxml:age>37</personxml:age>
    <cityxml:homecity>
        <cityxml:name>London</cityxml:name>
        <cityxml:lat>123.000</cityxml:lat>
        <cityxml:long>0.00</cityxml:long>
    </cityxml:homecity>
</personxml:person>

name现在我们已经完全限定了我们的 XML,对于每个元素的含义没有歧义。所有以开头的标记personxml:都是属于您的 XML 的标记,所有以开头的标记cityxml:都是我的。

有几点需要注意:

  • 如果您排除任何命名空间声明,则事物被视为在默认命名空间中。

  • 如果您声明一个没有标识符的命名空间,即xmlns="http://somenamespace",而不是xmlns:rob="somenamespace",它将指定文档的默认命名空间。

  • 实际的命名空间本身,通常是IRI,并没有真正的意义。它应该是唯一的,因此人们倾向于选择他们拥有的 IRI/URI,但它没有比这更重要的意义。有时人们会将 XML 的模式(定义)放在指定的 IRI 中,但这只是某些人的惯例。

  • 前缀也不重要。唯一重要的是前缀被定义为什么命名空间。几个以不同前缀开头的标签,所有映射到同一个命名空间的标签都被认为是相同的。

    例如,如果前缀personxmlmycityxml都映射到同一个命名空间(如下面的代码片段),那么如果给给定元素加上personxmlor前缀并不重要mycityxml,它们都会被 XML 解析器视为同一事物. 关键是 XML 解析器不关心您选择什么作为前缀,只关心它映射的名称空间。前缀只是指向命名空间的间接方式。

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
    
  • 属性可以是合格的,但通常不是。与元素相反,它们也不会从它们所在的元素继承其命名空间(见下文)。

此外,元素名称空间是从父元素继承的。换句话说,我同样可以将上述 XML 编写为

<person xmlns="http://www.your.example.com/xml/person">
    <name>Rob</name>
    <age>37</age>
    <homecity xmlns="http://www.my.example.com/xml/cities">
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>
于 2009-07-25T11:41:49.433 回答
318

它定义了一个XML 命名空间

在您的示例中,命名空间前缀为“ android ”,命名空间 URI为“ http://schemas.android.com/apk/res/android

在文档中,您会看到以下元素:<android:foo />

将命名空间前缀视为具有完整命名空间 URI 的短名称别名的变量。<http://schemas.android.com/apk/res/android:foo />当 XML 解析器读取文档时,就其“含义”而言,这相当于书写。

注意:您实际上不能使用完整的命名空间 URI 来代替 XML 实例文档中的命名空间前缀。

查看有关命名空间的本教程:http ://www.sitepoint.com/xml-namespaces-explained/

于 2009-07-25T11:25:29.340 回答
19

我认为最大的困惑是 xml 命名空间指向某种没有任何信息的 URL。但事实是,发明以下命名空间的人:

xmlns:android="http://schemas.android.com/apk/res/android"

也可以这样称呼:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"

这只是一个唯一标识符。但是,已确定您应该将唯一的 URL 放在那里,并且可能指向该命名空间中使用的标签/属性的规范。这不是必需的。

为什么它应该是独一无二的?因为命名空间的目的是使它们具有唯一性,因此可以将命名空间中称为背景的属性与来自另一个命名空间的背景区分开来。

由于这种独特性,您不必担心如果您创建自定义属性会发生名称冲突。

于 2016-02-17T14:23:21.680 回答
14

xmlns - xml 命名空间。这只是一种避免元素名称冲突的方法。例如:

<config xmlns:rnc="URI1" xmlns:bsc="URI2">
  <rnc:node>
      <rnc:rncId>5</rnc:rncId>
  </rnc:node>

  <bsc:node>
      <bsc:cId>5</bsc:cId>
  </bsc:node>
</config>

一个 xml 文件中有两个不同node的元素。如果没有命名空间,此文件将无效。

于 2015-06-08T20:13:18.110 回答
4

您有名称空间,因此您可以拥有全局唯一的元素。然而,在 99% 的情况下,这并不重要,但是当你把它放在The Semantic Web的角度来看时,它就开始变得重要了。

例如,您可以通过使用适当的xmlns. 例如,将朋友的朋友与vCard混搭等。

于 2009-07-26T09:40:13.680 回答