在這一節,我們來搜索一下Mozilla中還有哪些數據源,並學習如果使用自定義的RDF文件來作為數據源。
更多的Mozilla數據源(Other Mozilla Datasources)
Mozilla提供了很多數據源,所有的這些數據源的工作方式和書簽數據源都是很相似的,只是字段不同而已。下面通過一些實例展示了其中的幾個。
歷史記錄(The History List)
歷史記錄數據源可以讓用戶訪問網頁的浏覽歷史記錄列表,在這個列表中包含用戶最近訪問的網頁的地址。可以通過rdf:history來訪問這個數據 源裡的數據。下面的表格表明這個數據源裡具體有哪些資源(或者稱為字段)可以供我們使用。在需要使用的地方,調用下面的URL地址,就可以獲取相應的值。
Date http://home.Netscape.com/NC-rdf#Date 最後訪問日期 Name http://home.Netscape.com/NC-rdf#Name 網頁標題 Page http://home.Netscape.com/NC-rdf#Page 網頁名稱 Referrer http://home.Netscape.com/NC-rdf#Referrer 來源地址 URL http://home.Netscape.com/NC-rdf#URL 網頁URL Visit Count http://home.Netscape.com/NC-rdf#VisitCount 訪問數一個典型的歷史記錄通常會采用樹型結構來顯示,你只需把button或者treecell的label特性設置為相應的URL地址就可以。你可以將 ref特性的值設置為NC:HistoryRoot,也可以設置為NC:HistoryByDate,這樣就可以按日期排序了。
讓我們來看一個顯示歷史記錄的完整例子,在這個例子中,我們將在樹型結構中顯示三個字段:Name、Page和Date。
實例9.4.1: 下載源代碼
<tree flex="1" datasources="rdf:history" ref="NC:HistoryRoot">
其他數據源(Other Datasources)
<treecols>
<treecol id="name" label="Name" flex="1"/>
<treecol id="url" label="URL" flex="1"/>
<treecol id="date" label="Date" flex="1"/>
</treecols>
<template>
<rule>
<treechildren>
<treeitem uri="rdf:*">
<treerow>
<treecell label="rdf:http://home.Netscape.com/NC-rdf#Name"/>
<treecell label="rdf:http://home.Netscape.com/NC-rdf#URL"/>
<treecell label="rdf:http://home.Netscape.com/NC-rdf#Date"/>
</treerow>
</treeitem>
</treechildren>
</rule>
</template>
</tree>
下面列表列出了一些其他的Mozilla數據源,你可以根據需要直接使用這些數據源。
書簽數據源(rdf:bookmarks): 書簽數據源對應的是用戶的書簽列表。
資源列表 Added Date http://home.Netscape.com/NC-rdf#BookmarkAddDate 書簽的添加日期 Description http://home.Netscape.com/NC-rdf#Description 書簽的說明 Last ModifIEd http://home.Netscape.com/WEB-rdf#LastModifIEdDate 最後修改日期 Last Visited http://home.Netscape.com/WEB-rdf#LastVisitDate 最後訪問日期 Name http://home.Netscape.com/NC-rdf#Name 書簽名稱 Shortcut URL http://home.Netscape.com/NC-rdf#ShortcutURL 關鍵字 URL http://home.Netscape.com/NC-rdf#URL 書簽URL
可以使用的書簽類型
NC:BookmarksRoot 書簽分層結構的最頂層 NC:IEFavoritesRoot 對應於IE的書簽列表 NC:PersonalToolbarFolder 對應於自定義工具欄目錄文件(rdf:files): 對應於用戶的文件視圖。
資源 Name http://home.Netscape.com/NC-rdf#Name Name of the file URL http://home.Netscape.com/NC-rdf#URL URL of the file
可能會使用的根節點
NC:FilesRoot 文件數據源的最頂級,用於顯示驅動器列表 文件路徑 使用一個目錄作為ref特性的值,就可以返回這個目錄下的所有文件。比如可以指定file:///Windows或者files:///usr/local等。文件數據源是一個典型的按需加載數據源,所有的數據只有在需要的時候才會加載。實際上,我們也不需要這個數據源的數據在使用之前就加載,相反,我們需要只有在樹型結構中實際顯示數據的時候才去加載數據源裡對應的文件列表。
綜合數據源(Composite Datasources)
你可以像下面的例子一樣,在datasources特性中定義多個數據源,每個數據源之間用空格符分割。這樣就可以從所有聲明的數據源中讀取數據。
<tree datasources="rdf:bookmarks rdf:history animals.rdf"
ref="NC:BookmarksRoot">
在這個例子中,會從書簽、歷史記錄和animals.rdf文件三個來源讀取數據。這三個數據源被組合到一個綜合數據源中,使用起來和一個數據源沒有任何差別。
特殊數據源rdf:null代表什麼都不做,如果你要在腳本中動態設置數據源,而又不想設置一個默認數據源或者不知道數據源的確切地址時,就可以把datasources特性設置為rdf:null。
自定義RDF數據源(Custom RDF Datasources)
你可以根據需要使用上面提到過的內部數據源,內部數據源還有一些其他的,比如郵件列表、地址簿和搜索結果等。但可能所有的內部數據源都不滿足你的需 要,你需要將自己的數據儲存在一個RDF文件中。這個文件可以是本地的,也可以在遠程的服務器中,只需要在datasources特性中設置RDF對應的 URL地址就可以。
使用RDF文件作為數據源,在功能上和內部數據源是相同的。你可以使用規則來匹配特別類型的內容。rule元素上的特性只要和數據源文件中的Description元素相匹配就會獲取數據。你還可以建立分層結構的RDF數據文件。
下面的例子展示了怎樣使用RDF文件作為數據源,RDF文件真的很大,沒有列在這裡,但你可以在這兩個鏈接查看:文本格式代碼 實際的RDF數據源
實例 9.4.2: 源代碼 預覽執行結果
<tree flex="1" width="200" height="200"
datasources="animals.rdf" ref="http://www.some-fictitious-zoo.com/all-animals">
<treecols>
<treecol id="name" label="Name" primary="true" flex="1"/>
<treecol id="species" label="SpecIEs" flex="1"/>
</treecols>
<template>
<rule>
<treechildren>
<treeitem uri="rdf:*">
<treerow>
<treecell label="rdf:http://www.some-fictitious-zoo.com/rdf#name"/>
<treecell label="rdf:http://www.some-fictitious-zoo.com/rdf#specIEs"/>
</treerow>
</treeitem>
</treechildren>
</rule>
</template>
</tree>
在這個例子中,數據是通過文件中的數據源加載的。ref特性對應於RDF文件裡seq元素。運行結果展示的是一個動物的列表。只要我們有需要,可以 把ref特性的值設置為其他數據源中根元素的about特性值,這樣就可以返回我們需要的數據。比如要只顯示所有的回復,我們只需要把ref的值設置為“http://www.some-fictitious-zoo.com/reptiles”。
下面的例子展示了需要使用RDF數據源中的特定部分數據時,應該怎樣設置ref特性的值。
實例 9.4.3: 源代碼 預覽執行結果
<window
id="example-window"
title="History List"
XMLns:ANIMALS="http://www.some-fictitious-zoo.com/rdf#"
XMLns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<button label="Click here to see the mammals the zoo has" type="menu"
datasources="animals.rdf" ref="http://www.some-fictitious-zoo.com/mammals">
<template>
<rule ANIMALS:specimens="0"></rule>
<rule>
<menupopup>
<menuitem uri="rdf:*" label="rdf:http://www.some-fictitious-zoo.com/rdf#name"/>
</menupopup>
</rule>
</template>
</button>
</window>
在這個例子中,我們只想加載哺乳動物的數據,所以我們指定了哺乳動物列表的URI地址。在這裡,ref特性的值被設置為“http://www.some-fictitious-zoo.com/mammals”,也就是對應於RDF文件裡其中一個seq元素,這樣最後只會返回這個seq元素的子元素。
在這裡使用了兩條規則。第一條規則捕獲所有擁有ANIMALS:specimens特 性,並且該特性的值等於0的資源。在RDF文件中,每個description元素都包含這個特性,而其中的一些設置這個特性的值為0,而等於0的這些資 源就會根據規則一而被匹配。但規則一並沒有包含任何內容,所以就算匹配也不會顯示出來什麼。我們通常使用這個技巧來隱藏那些我們不想顯示的數據。
第二條規則用來匹配剩下的那些資源,並在彈出菜單中增加一個菜單項。最後的效果就是我們生成了一個彈出菜單,而菜單項的內容對應於所有specime不是0的哺乳動物。
譯者注:
本文是XUL教程第九章的第四節,文章的內容已經很古老了,比如例子中都是以Mozilla浏覽器為基礎講的,而Mozilla已經停止開發了,但是大部分對於Firefox來說還是一樣的。