“xmlns"在XML中是什么意思?

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

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

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

是什么?

324789 次浏览

它定义了XML名称空间

在你的例子中,名称空间前缀是"安卓",而名称空间URI是"http://schemas.android.com/apk/res/android"

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

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

< em >注意:实际上不能在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:开头的标签都属于我的。

这里有几点需要注意:

  • 如果排除任何名称空间声明,则将认为内容位于默认名称空间中。

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

  • 实际的名称空间本身,通常是a IRI,没有实际的影响。它应该是唯一的,所以人们倾向于选择自己拥有的IRI/URI,但它没有比这更大的意义。有时人们会将XML的模式(定义)放在指定的IRI中,但这只是一些人的习惯。

  • 前缀也不重要。唯一重要的是将前缀定义为什么名称空间。以不同前缀开头的几个标记都映射到同一个名称空间,这些标记都被认为是相同的。

    例如,如果前缀personxmlmycityxml都映射到相同的名称空间(如下面的代码片段所示),那么将给定元素前缀为personxmlmycityxml并不重要,XML解析器会将它们视为相同的东西。关键在于XML解析器并不关心您选择了什么作为前缀,只关心它映射的名称空间。前缀只是一个指向命名空间的间接

    <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).

Also, element namespaces are inherited from the parent element. In other words I could equally have written the above XML as

<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%的情况下这并不重要,但是当你把它放在语义网的角度时,它就开始变得重要了。

例如,您可以通过使用适当的xmlns来制作不同模式的XML混搭。例如,将一个朋友的朋友与电子名片混搭,等等。

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元素。如果没有名称空间,该文件将无效。

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

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

也可以这样叫它:

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

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

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

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