我在XML文件中看到以下行:
xmlns:android=”http://schemas.android.com/apk/res/android"
在我遇到的许多其他XML文件中,我也看到了xmlns
这是什么
它意味着XML名称空间
基本上,XML中的每个元素(或属性)都属于一个名称空间,这是“限定”元素名称的一种方式
想象一下,你和我都发明了我们自己的XML。你发明XML来描述人,我发明XML来描述城市。我们两个都包含一个名为name的元素。你指的是人的名字,我指的是城市的名字好吧,这有点做作
<;人>;
<;名称>;罗布</名称>;
<;年龄>;37</年龄>;
<;家乡>;
<;名称>;伦敦</名称>;
<;lat>;123.000</lat>;
<;长期>;0.00</长期>;
</家乡>;
</人>;
如果我们将两个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>;罗布</personxml:name>;
<;personxml:age>;37</personxml:age>;
<;cityxml:家乡城市>;
<;cityxml:name>;伦敦</cityxml:name>;
<;城市XML:lat>;123.000</城市XML:lat>;
<;cityxml:long>;0.00</cityxml:long>;
</cityxml:家乡城市>;
</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编写为
<;人xmlns=”http://www.your.example.com/xml/person“>;
<;名称>;罗布</名称>;
<;年龄>;37</年龄>;
<;homecity xmlns=”http://www.my.example.com/xml/cities“>;
<;名称>;伦敦</名称>;
<;lat>;123.000</lat>;
<;长期>;0.00</长期>;
</家乡>;
</人>;