我在一个XML文件中看到了下面这行:

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

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

是什么?


它定义了一个XML命名空间。

在你的例子中,命名空间前缀是“android”,命名空间URI是“http://schemas.android.com/apk/res/android”

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

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

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

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


它表示XML名称空间。

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

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

这里有几点需要注意:

If you exclude any namespace declarations, things are considered to be in the default namespace. If you declare a namespace without the identifier, that is, xmlns="http://somenamespace", rather than xmlns:rob="somenamespace", it specifies the default namespace for the document. The actual namespace itself, often a IRI, is of no real consequence. It should be unique, so people tend to choose a IRI/URI that they own, but it has no greater meaning than that. Sometimes people will place the schema (definition) for the XML at the specified IRI, but that is a convention of some people only. The prefix is of no consequence either. The only thing that matters is what namespace the prefix is defined as. Several tags beginning with different prefixes, all of which map to the same namespace are considered to be the same. For instance, if the prefixes personxml and mycityxml both mapped to the same namespace (as in the snippet below), then it wouldn't matter if you prefixed a given element with personxml or mycityxml, they'd both be treated as the same thing by an XML parser. The point is that an XML parser doesn't care what you've chosen as the prefix, only the namespace it maps too. The prefix is just an indirection pointing to the namespace. <personxml:person xmlns:personxml="http://example.com/same/url" xmlns:mycityxml="http://example.com/same/url" /> Attributes can be qualified but are generally not. They also do not inherit their namespace from the element they are on, as opposed to elements (see below).

同样,元素名称空间继承自父元素。换句话说,我可以把上面的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>

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

例如,您可以通过使用适当的xmlns来混合不同的模式。例如,用vCard把朋友的朋友混在一起,等等。


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文件中的两个不同节点元素。如果没有名称空间,该文件将无效。


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

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

也可以这样叫它:

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

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

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

由于这种唯一性,你不需要担心如果你创建自定义属性会有名称冲突。