我在一个XML文件中看到了以下行:
xmlns:android="http://schemas.android.com/apk/res/android"
我还看到许多其他的XML文件中也出现了xmlns
。
它是什么意思?
我在一个XML文件中看到了以下行:
xmlns:android="http://schemas.android.com/apk/res/android"
我还看到许多其他的XML文件中也出现了xmlns
。
它是什么意思?
它的意思是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
元素,但它们具有不同的含义。<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中,但这只是某些人的惯例。
前缀本身并不重要,唯一重要的是前缀定义为哪个命名空间。多个以不同前缀开头的标记,所有这些前缀都映射到相同的命名空间,都被视为XML解析器中的同一个标记。
例如,如果personxml
和mycityxml
两个前缀都映射到相同的命名空间(如下面的代码片段),则如果您在给定元素的前面加上personxml
或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>
它定义了一个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/
<LinearLayout>
没有前缀也能正常工作吗? - Asif Mushtaq我认为最大的困惑在于XML命名空间指向了一个没有任何信息的URL。但事实上,发明下面这个命名空间的人:
xmlns:android="http://schemas.android.com/apk/res/android"
也可以这样称呼它:
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
这只是一个唯一标识符。然而,建议您在此处放置唯一的URL,该URL可能指向该命名空间中使用的标签/属性的规范。但这不是必需的。
为什么它应该是唯一的?因为命名空间的目的是使它们唯一,因此来自您的命名空间的例如称为background的属性可以与另一个命名空间的background区分开来。
由于这种唯一性,您无需担心如果创建自定义属性会出现名称冲突。
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文件中有两个不同的节点
元素。如果没有命名空间,这个文件将是无效的。
对一个常见问题的新、简洁而完整的回答...
xmnls
支持XML命名空间,提供了一种标准的方式来命名XML元素和属性,以便可以将独立开发的词汇表合并而不会产生命名冲突。
XML命名空间使XML模式作者能够区分在独立开发的模式中相同的元素和属性名称。基于URI的命名空间名称利用了域名的唯一性和所有权方面,以防止命名冲突(唯一性)并建立命名权威(所有权)。
xmlns
的目的xmlns
在XML命名空间中有两种不同的用法:
默认命名空间声明
<element xmlns="http://www.example.org">
声明element
及其所有子元素都在http://www.example.org
命名空间中默认情况下。
命名空间前缀声明
<ex:element xmlns:ex="http://www.example.org">
声明ex:element
及其
都以ex:
作为前缀,并且属于http://www.example.org
命名空间。
通过使用xmlns
和默认命名空间声明或命名空间前缀声明,您可以安全地将您的XML与来自http://www.example.org
命名空间的XML混合在一起,而不必担心命名冲突。
xmlns
有两种含义:(1)xmlns="X"
表示X
是默认命名空间;(2)xmlns:pf="X"
表示pf
是一个命名空间前缀,可以作为对X
的一种缩写。请参阅下面我简明而完整的答案以了解更多详情。 - kjhughes