作為一名 Android 開發(fā)擎析,我想大家對xmlns
并不會陌生,因?yàn)樵趯懖季治募?如下代碼所示)的時候經(jīng)常會碰到,雖然很多人對其含義并不是特別了解(比如說我)揍魂。好吧桨醋,今天我們就來挖一挖這神奇的xmlns
。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/window_background">
</LinearLayout>
什么是xmlns
首先现斋,我們先來看下到底什么是xmlns
喜最,它是 XML 文檔中的一個概念:英文叫做 XML namespace,中文翻譯為 XML 命名空間庄蹋。一講到命名空間瞬内,我想很多人會聯(lián)想到C++
中的namespace
和Java
中的 packagename,而這兩者的作用都是為了解決命名上的沖突(例如類名限书,接口名等)虫蝶。類似的,XML namespace
也是為了解決 XML 中元素和屬性命名沖突倦西,因?yàn)?XML 中的標(biāo)簽并不是預(yù)定義的能真,這一點(diǎn)與 HTML 是有區(qū)別的,HTML 中的標(biāo)簽是預(yù)定義的扰柠,所以我們會遇到命名沖突的問題粉铐。
XML 命名空間定義語法為xmlns:namespace-prefix="namespaceURI"
,一共分為三個部分:
-
xmlns
:聲明命名空間的保留字卤档,其實(shí)就是XML中元素的一個屬性蝙泼; -
namespace-prefix
:命名空間的前綴针史,這個前綴與某個命名空間相關(guān)聯(lián)猪勇; -
namespaceURI
:命名空間的唯一標(biāo)識符明棍,一般就是一個URI引用。
通過上面的內(nèi)容的講解哨免,我們對命名空間有了一定的了解,下面我們通過一個例子引用來說明一下xmlns
屬性是如何解決命名沖突的:
命名沖突
在 XML 中昙沦,元素名稱是由開發(fā)者定義的琢唾,當(dāng)兩個不同的文檔使用相同的元素名時,就會發(fā)生命名沖突盾饮。這個 XML 文檔攜帶著某個表格中的信息:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
這個 XML 文檔攜帶有關(guān)桌子的信息:
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
假如這兩個 XML 文檔被一起使用采桃,由于兩個文檔都包含帶有不同內(nèi)容和定義的
<table>
元素,就會發(fā)生命名沖突丘损。XML 解析器無法確定如何處理這類沖突普办。
使用命名空間(Namespace)
這個XML文檔攜帶著某個表格中的信息:
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
此XML文檔攜帶著有關(guān)一件家具的信息:
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
我們?yōu)?code><table>標(biāo)簽添加了一個
xmlns
屬性,并在每個標(biāo)簽前面都添加了相應(yīng)的前綴徘钥,這個前綴是一個與某個命名空間相關(guān)聯(lián)的限定名稱衔蹲,這個前綴就代表后面那個 URI 引用,或者說一個縮寫呈础。
關(guān)于xmlns
就先簡單講到這里舆驶,大家如果要深入了解的話橱健,可以點(diǎn)擊本文中的跳轉(zhuǎn)鏈接,下一節(jié)我們來看下 Android 中的那些xmlns沙廉。
Android中的xmlns
在Android中拘荡,目前我們碰到的xmlns
一共有三種:
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android
命名空間android
用于 Android 系統(tǒng)定義的一些屬性。
app
命名空間app
用于我們應(yīng)用自定義的一些屬性撬陵,這個與 Android 自定義屬性和系統(tǒng)控件擴(kuò)展應(yīng)該有關(guān)系珊皿,大家可以再繼續(xù)研究一下。
tools
根據(jù)官方定義袱结,tools
命名空間用于在 XML 文檔記錄一些亮隙,當(dāng)應(yīng)用打包的時候,會把這部分信息給過濾掉垢夹,不會增加應(yīng)用的 size溢吻,說直白點(diǎn),這些屬性是為IDE提供相關(guān)信息果元。
參考文章
Tools Attributes
What does “xmlns” in XML mean
What is the 'app' Android XML namespace