XML中的“xmlns”是什么意思?

时间:2009-07-25 11:18:37

标签: xml xml-namespaces

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

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

我在许多其他XML文件中也看到了xmlns

这是什么?

6 个答案:

答案 0 :(得分:639)

这意味着XML namespace

基本上,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>

现在我们已经完全限定了我们的XML,每个name元素的含义并不含糊。所有以personxml:开头的代码都是属于您的XML的代码,所有以cityxml:开头的代码都是我的。

有几点需要注意:

  • 如果排除任何名称空间声明,则会将其视为默认名称空间。

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

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

  • 前缀也无关紧要。唯一重要的是前缀定义为什么命名空间。以不同前缀开头的几个标签都被认为是相同的。

    例如,如果前缀personxmlmycityxml都映射到相同的命名空间(如下面的代码段中所示),那么如果使用{{1为前缀元素添加前缀,则无关紧要或者personxml,它们都被XML解析器视为同一个东西。关键是XML解析器不关心你选择什么作为前缀,只关心它所映射的命名空间。前缀只是指向命名空间的间接

    mycityxml
  • 属性可以限定,但通常不是。它们也从它们所在的元素继承它们的命名空间,而不是元素(见下文)。

此外,元素名称空间继承自父元素。换句话说,我同样可以将上面的XML写成

<personxml:person 
     xmlns:personxml="http://example.com/same/url"
     xmlns:mycityxml="http://example.com/same/url" />

答案 1 :(得分:279)

它定义了XML Namespace

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

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

将名称空间前缀视为具有完整名称空间URI的短名称别名的变量。当XML解析器读取文档时,它相当于编写 <http://schemas.android.com/apk/res/android:foo /> 关于它“意味着什么”。

注意: 您无法在XML实例文档中实际使用完整名称空间URI代替名称空间前缀。

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

答案 2 :(得分:11)

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元素。如果没有命名空间,则此文件无效。

答案 3 :(得分:11)

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

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

也可以这样称呼:

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

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

为什么它应该是唯一的?因为命名空间的目的是使它们唯一,所以可以将命名空间中名为 background 的属性与另一个命名空间中的 background 区分开来。

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

答案 4 :(得分:4)

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

例如,您可以使用适当的xmlns对不同方案进行XML混搭。例如,用vCard等方式混搭朋友的朋友

答案 5 :(得分:0)

XML命名空间提供了一种避免元素名称冲突的方法。 在XML中,元素名称由开发人员定义。当尝试混合来自不同XML应用程序的XML文档时,这通常会导致冲突。

使用名称前缀可以轻松避免XML中的名称冲突。当在XML中使用前缀时,必须定义前缀的命名空间。

命名空间可以由元素的开始标记中的xmlns属性定义。名称空间声明具有以下语法。的的xmlns:前缀=&#34; URI&#34;