作為一名 Android 開發(fā),我想大家對xmlns
并不會陌生,因為在寫布局文件(如下代碼所示)的時候經(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 中元素和屬性命名沖突,因為 XML 中的標簽并不是預定義的,這一點與 HTML 是有區(qū)別的,HTML 中的標簽是預定義的,所以我們會遇到命名沖突的問題。
XML 命名空間定義語法為xmlns:namespace-prefix="namespaceURI"
,一共分為三個部分:
-
xmlns
:聲明命名空間的保留字,其實就是XML中元素的一個屬性; -
namespace-prefix
:命名空間的前綴,這個前綴與某個命名空間相關聯(lián); -
namespaceURI
:命名空間的唯一標識符,一般就是一個URI引用。
通過上面的內(nèi)容的講解,我們對命名空間有了一定的了解,下面我們通過一個例子引用來說明一下xmlns
屬性是如何解決命名沖突的:
命名沖突
在 XML 中,元素名稱是由開發(fā)者定義的,當兩個不同的文檔使用相同的元素名時,就會發(fā)生命名沖突。這個 XML 文檔攜帶著某個表格中的信息:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
這個 XML 文檔攜帶有關桌子的信息:
<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文檔攜帶著有關一件家具的信息:
<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>標簽添加了一個
xmlns
屬性,并在每個標簽前面都添加了相應的前綴,這個前綴是一個與某個命名空間相關聯(lián)的限定名稱,這個前綴就代表后面那個 URI 引用,或者說一個縮寫。
關于xmlns
就先簡單講到這里,大家如果要深入了解的話,可以點擊本文中的跳轉(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
用于我們應用自定義的一些屬性,這個與 Android 自定義屬性和系統(tǒng)控件擴展應該有關系,大家可以再繼續(xù)研究一下。
tools
根據(jù)官方定義,tools
命名空間用于在 XML 文檔記錄一些,當應用打包的時候,會把這部分信息給過濾掉,不會增加應用的 size,說直白點,這些屬性是為IDE提供相關信息。
參考文章
Tools Attributes
What does “xmlns” in XML mean
What is the 'app' Android XML namespace