我在XML文件中看到以下行:
xmlns:android="http://schemas.android.com/apk/res/android"
我也看过 xmlns
遇到了许多其他XML文件。
它是什么?
我在XML文件中看到以下行:
xmlns:android="http://schemas.android.com/apk/res/android"
我也看过 xmlns
遇到了许多其他XML文件。
它是什么?
Answers:
它定义了XML命名空间。
在您的示例中,命名空间前缀为“ android ”,命名空间URI为“ http://schemas.android.com/apk/res/android ”
在文档中,您将看到以下元素: <android:foo />
将名称空间前缀视为具有完整名称空间URI的简称别名的变量。<http://schemas.android.com/apk/res/android:foo />
就XML解析器读取文档时的“含义”而言,这相当于写作。
注意:您实际上不能使用完整的名称空间URI代替XML实例文档中的名称空间前缀。
查看有关名称空间的本教程:http : //www.sitepoint.com/xml-namespaces-explained/
<LinearLayout
是没有前缀的作品?
这意味着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"
,它将指定文档的默认名称空间。
实际的名称空间本身(通常是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>
我认为最大的困惑是xml名称空间指向的是没有任何信息的URL。但事实是,发明了以下名称空间的人:
xmlns:android="http://schemas.android.com/apk/res/android"
也可以这样称呼它:
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
这只是一个唯一标识符。但是,已确定您应该在其中放置唯一的URL,并且可以潜在地指向该命名空间中使用的标记/属性的规范。不需要。
为什么它应该是独特的?因为命名空间的目的是让他们独特因此,例如所谓的属性背景从您的命名空间可以从被区分背景从另一个命名空间。
由于具有这种唯一性,因此您不必担心,如果创建自定义属性,则会发生名称冲突。