我在XML文件中看到如下行: node
xmlns:android="http://schemas.android.com/apk/res/android"
我还遇到了许多其余XML文件中的xmlns
。 android
它是什么? 架构
它定义了XML命名空间 。 url
在您的示例中, 命名空间前缀为“ android ”, 命名空间URI为“ http://schemas.android.com/apk/res/android ” spa
在文档中,您会看到相似如下内容的元素: <android:foo />
code
将名称空间前缀视为具备完整名称空间URI的简称别名的变量。 关于XML解析器读取文档时的“含义”,这至关于编写<http://schemas.android.com/apk/res/android:foo />
。 xml
注意: 您实际上不能使用完整的名称空间URI代替XML实例文档中的名称空间前缀。 对象
查看有关名称空间的本教程: http : //www.sitepoint.com/xml-namespaces-explained/ 继承
这意味着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:
开头的cityxml:
都是个人。
有几点要注意:
若是排除任何名称空间声明,则将事物视为默认名称空间。
若是您声明一个没有标识符的名称空间,即xmlns="http://somenamespace"
,而不是xmlns:rob="somenamespace"
,它将为文档指定默认名称空间。
实际的名称空间自己(一般是IRI )没有任何实际意义。 它应该是惟一的,所以人们倾向于选择本身拥有的IRI / URI,但没有比这更大的意义了。 有时人们会将XML的架构(定义)放在指定的IRI处,但这仅是某些人的约定。
前缀也不重要。 惟一重要的是前缀定义为哪一个命名空间。 多个以不一样前缀开头的标签,它们都映射到相同的名称空间,被认为是相同的。
例如,若是前缀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>
您具备名称空间,所以能够具备全局惟一的元素。 可是,在99%的时间中这并不重要,可是当您将其放在The Semantic Web的角度来看时,它开始变得很重要。
例如,您能够仅使用适当的xmlns
进行不一样方案的XML混搭。 例如,使用vCard混搭一个朋友的朋友。
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,而且能够潜在地指向该命名空间中使用的标记/属性的规范。 不须要。
为何它应该是独特的? 由于命名空间的目的是让他们独特所以,例如所谓的从您的命名空间的背景属性能够从另外一个命名空间的背景区分开来。
因为具备这种惟一性,所以您没必要担忧,若是建立自定义属性,则会发生名称冲突。