XML中的“xmlns”是什么意思?
我在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的短名称别名的variables。 这相当于在XMLparsing器读取文档时,它的意思是写<http://schemas.android.com/apk/res/android:foo />
。
注意:您不能实际使用完整的名称空间URI来代替XML实例文档中的名称空间前缀。
查看名称空间上的这个教程: http : //www.sitepoint.com/xml-namespaces-explained/
这意味着XML命名空间 。
基本上, XML中的每个元素(或属性)都属于一个名称空间,这是一种“限定”元素名称的方法。
想象一下你和我都创造了我们自己的XML。 你发明XML来描述人,我发明我的描述城市。 我们两个都包含名为的元素。 你的名字是指这个人的名字,而我的名字是这个城市的名字 – 好吧,这有点做作。
<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:
开头的cityxml:
都是我的。
有几点需要注意:
-
如果排除任何名称空间声明,则认为事物处于默认名称空间中。
-
如果您声明不带标识符的名称空间,即
xmlns="http://somenamespace"
,而不是xmlns:rob="somenamespace"
,则它指定文档的默认名称空间。 -
实际的命名空间本身,通常是一个IRI ,并不是真正的结果。 它应该是唯一的,所以人们倾向于select他们拥有的IRI / URI,但没有比这更大的含义。 有时候人们会将XML的模式(定义)放在指定的IRI上,但这只是一些人的惯例。
-
前缀也是无关紧要的。 唯一重要的是前缀被定义为什么名称空间。 几个标签以不同的前缀开头,所有映射到同一个名字空间的标签被认为是相同的。
例如,如果前缀
personxml
和mycityxml
都映射到相同的名称空间(如下面的代码片段所示),那么使用personxml
或mycityxml
前缀给定的元素personxml
mycityxml
,它们都将被视为相同的东西由一个XMLparsing器。 重点是XMLparsing器不关心你select的前缀,只是它映射的名字空间。 前缀只是指向名称空间的间接方式 。<personxml:person xmlns:personxml="http://example.com/same/url" xmlns:mycityxml="http://example.com/same/url" />
-
属性可以是合格的,但通常不是。 它们也不会从元素中inheritance它们的名称空间,而不是元素(参见下文)。
另外,元素名称空间是从父元素inheritance的。 换句话说,我同样可以把上面的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>
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
元素。 没有命名空间这个文件将无效。
我认为最大的混乱是xml命名空间指向某种没有任何信息的URL。 但事实是,在名字空间下面发明的人:
xmlns:android="http://schemas.android.com/apk/res/android"
也可以这样称呼它:
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
这只是一个唯一的标识符。 然而,确定您应该在那里放置唯一的URL,并且可能指向该名称空间中使用的标记/属性的规范。 这不是必需的。
为什么它应该是唯一的? 因为命名空间的目的是使它们具有唯一性,所以例如名称空间中的背景名称可以与另一个命名空间中的背景名称区分开来。
由于这种独特性,您不必担心如果您创build自定义属性,就会产生名称冲突。
你有名字空间,所以你可以有全球独特的元素。 然而,99%的时间这并不重要,但是当你把它放在语义网的angular度时,就变得很重要了。
例如,您可以通过使用适当的xmlns
来制作不同scheme的XML混搭。 例如,用vCard等混搭好友的朋友
XML名称空间提供了一种避免元素名称冲突的方法。 在XML中,元素名称是由开发人员定义的。 当尝试混合来自不同XML应用程序的XML文档时,通常会导致冲突。
XML中的名称冲突可以使用名称前缀轻松避免。当在XML中使用前缀时,必须定义前缀的名称空间。
命名空间可以由元素的开始标记中的xmlns属性定义。命名空间声明具有以下语法。 xmlns:prefix =“URI” 。