本文將解釋UX markup語言是如何關聯Uno文檔中的命名空間的,以及他們之間協同工作的原理。
首先普及下何為命名空間
在XML中命名空間提供避免元素命名沖突的方法,在 XML(標準通用標記語言下的一個子集) 中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突,具體參看本文尾部的命名空間詳解。
默認命名空間池The Default Namespace Pool
默認狀態時,在你的項目及他引用的包packages中,一個UX文檔將要知道關于所有的類,包括公共的public
和可實例化instantiatable
的類classes。
默認的?命名空間池包括無XML命名空間前綴但可以訪問和存取的命名空間集合(以下簡稱命名空間集)。namespaces that are accessible with no XML namespace prefix.
在一個默認的項目中,默認的命名空間池就包括下面的命名空間集:
- global::
- Fuse
- Fuse.Animations
- Fuse.Drawing
- Fuse.Entities
- Fuse.Controls
- Fuse.Layouts
- Fuse.Shapes
- Fuse.Elements
- Fuse.Effects
- Fuse.Triggers
- Fuse.Navigation
- Fuse.Triggers.Actions
- Fuse.Gestures
- Fuse.Resources
這意味著任何從命名空間清單中列出的類,包括在全局命名空間global namespace在的類,在UX都支持無前綴或參數限定符的方式存取。(重定義除外unless overridden)
重新定義默認命名空間池Overriding the default namespace pool
包含在默認命名空間池中的所有命名空間集都能使用xmlns
屬性來指定,重定義將應用到被指定的元素和他的子分支樹上面its subtree。
下例中,這些來自于Fuse
和MyCompany.MyLibrary
的類在沒有XML命名空間前綴的情況下也是可以訪問的。
<pre>
<App xmlns="Fuse, MyCompany.MyLibrary">
<MyClass />
</App>
</pre>
MyCompany.MyLibrary.MyClass
之所以能以無前綴的方式使用,是因為他在此處的上下文環境中來說是在默認命名空間池里的。
?使用整個命名空間路徑來訪問類full namespace path
類也能使用他們的完整命名空間路徑來訪問,像這樣:
<pre>
<App>
<MyCompany.MyLibrary.MyClass />
</App>
</pre>
指定XML命名空間前綴
定制自建命名空間前綴后便支持使用“短名稱”shortcut來訪問命名空間集,無重定義默認的命名空間池。without overriding the default namespace pool.
定制的前綴必須使用一個指定的定制屬性關鍵詞xmlns:
,像這樣:
<pre>
<App xmlns:m="MyCompany.MyLibrary">
<m:MyClass />
</App>
</pre>
附:詳解命名空間
在XML里,任何元素類別或者屬性因此分為兩部分名字,一個是命名空間里的名字另一個是它的本地名。在XML里,命名空間通常是一個統一資源識別符(URI)的名字。而URI之只當名字用。主要目的是為了避免名字的沖突。
命名空間是用來組織和重用代碼的。如同名字一樣的意思,NameSpace(名字空間),之所以出來這樣一個東西,是因為人類可用的單詞數太少,并且不同的人寫的程序不可能所有的變量都沒有重名現象,對于庫來說,這個問題尤其嚴重,如果兩個人寫的庫文件中出現同名的變量或函數(不可避免),使用起來就有問題了。為了解決這個問題,引入了名字空間這個概念,通過使用 namespace xxx;你所使用的庫函數或變量就是在該名字空間中定義的,這樣一來就不會引起不必要的沖突了。
通常來說,命名空間是唯一識別的一套名字,這樣當對象來自不同的地方但是名字相同的時候就不會含糊不清了。使用擴展標記語言的時候,XML的命名空間是所有元素類別和屬性的集合。元素類別和屬性的名字是可以通過唯一XML命名空間來唯一。
在XML中命名空間提供避免元素命名沖突的方法
什么是命名沖突
在 XML(標準通用標記語言下的一個子集) 中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突。
在XML里,任何元素類別或者屬性因此分為兩部分名字,一個是命名空間里的名字另一個是它的本地名。在XML里,命名空間通常是一個統一資源識別符(URI)的名字。而URI之只當名字用。主要目的是為了避免名字的沖突。
這個XML文檔攜帶著某個表格中的信息:
<pre>
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
</pre>
這個 XML 文檔攜帶有關桌子的信息(一件家具):
<pre>
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
</pre>
假如這兩個 XML 文檔被一起使用,由于兩個文檔都包含帶有不同內容和定義的 <table>
元素,就會發生命名沖突。
XML 解析器無法確定如何處理這類沖突。
使用前綴來避免命名沖突
此文檔帶有某個表格中的信息:
<pre>
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
</pre>
此 XML 文檔攜帶著有關一件家具的信息:
<pre>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</pre>
現命名沖突已經不存在了,這是由于兩個文檔都使用了不同的名稱來命名它們的 <table>
元素 (<h:table>
和 <f:table>
)。
通過使用前綴,我們創建了兩種不同類型的 <table>
元素。
使用命名空間(Namespaces
)
這個 XML 文檔攜帶著某個表格中的信息:
<pre>
<h:table xmlns:h="namespaceURI">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
</pre>
此 XML 文檔攜帶著有關一件家具的信息:
<pre>
<f:table xmlns:f="namespaceURI">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</pre>
與僅僅使用前綴不同,我們為 <table>
標簽添加了一個 xmlns 屬性,這樣就為前綴賦予了一個與某個命名空間相關聯的限定名稱。
XML Namespace (xmlns) 屬性
XML 命名空間屬性被放置于元素的開始標簽之中,并使用以下的語法:
xmlns:namespace-prefix="namespaceURI"
當命名空間被定義在元素的開始標簽中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。
注釋:用于標示命名空間的地址不會被解析器用于查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為指針來使用命名空間指向實際存在的網頁,這個網頁包含關于命名空間的信息。
統一資源標識符(URI)
統一資源標識符是一串可以標識因特網資源的字符。最常用的 URI 是用來標示因特網域名地址的統一資源定位器(URL)。另一個不那么常用的 URI 是統一資源命名(URN)。在我們的例子中,我們僅使用 URL。
默認的命名空間(Default Namespaces)
為元素定義默認的命名空間可以讓我們省去在所有的子元素中使用前綴的工作。
請使用下面的語法:
xmlns="namespaceURI"
這個 XML 文檔攜帶著某個表格中的信息:
<pre>
<table xmlns="namespaceURI">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
</pre>
部分參考資料:https://www.fusetools.com/learn/guides/ux-markup-namespaces
Tag:Fuse, Fuseapp, Fusetools, native app
發布時間:2016年05月11日
博客被黑,挪窩簡書安家……