在繼續閱讀本文之前,您務必要對我們在本專欄中將要討論的一些技術有所了解。我們要使用的技術包括:可擴展的樣式表語言轉換(Extensible Stylesheet Language Transformations,XSLT)、XML 路徑語言(XML Path Language,XPath)和資源描述框架(Resource Description Framework,RDF)。在 參考資料部分有到關于所有這些技術的信息的鏈接。
4Suite Server 概述
我們將使用由本文作者參與開發的 XML 資源庫 4Suite Server(4SS)作為本文中示例的應用程序基礎。4Suite Server 是一個 XML 資源庫,它帶有許多用于 XML 數據和元數據管理的功能程序,無論使用 Python 與否,這些功能程序都使得 4Suite Server 非常適合 Web 服務的快速開發。
本文中的示例是用 4Suite Server 0.11 編寫的,需要使用 Python 1.5.2 或更高版本和 4Suite 0.11。在 參考資料部分有下載所有這些應用程序的鏈接。
在線軟件資源庫
本文是“Python Web Services Developer”專欄的第二部分,卻是關于構建在線軟件資源庫的三部分系列的第一部分。在這部分中,我們將構建我們的基礎架構。在隨后的專欄中,我們將特別描述如何使用各種協議(例如,簡單對象訪問協議(Simple Object Access Protocol,SOAP)、HTTP 和 WWW 分布式編寫和版本控制(WWW Distributed Authoring and Versioning,WebDAV))搜索建立了索引的內容和基于代理的內容添加或內容檢索。
我們的在線軟件資源庫服務模式是基于 RPMFind.net 中的 RDF 模式的,但關系不太緊密。RPMFind 是一個用流行的 Red Hat 包管理器(Red Hat Package Manager,RPM)格式為 UNIX 和 Linux 軟件包編制目錄的系統。它包含關于軟件包的關鍵元數據(包括作者、版本和描述,格式為 RDF,詳見 清單 1)。關于 RDF 的簡短定義,請閱讀本專欄的前一期,或者去 參考資料部分查找這個簡單格式基本介紹的鏈接。
XML 的實際格式是不相關的。事實上,因為所描述的技術適用于任何類型的 XML 內容,所以根本沒必要去描述軟件。您可以用這種技術描述書的目錄、雇員信息,或者甚至是餐館的酒類一覽表。
這個示例中使用的所有代碼和數據文件都可以從 參考資料部分的鏈接下載。
文檔定義
在 4SS 的 XML 資源庫中,文檔定義允許您指定 XML 內容和 RDF 元數據之間的一個映射。為此,您需要定義由三個 XPath 表達式組成的集:一個主語(subject)表達式、一個謂語(predicate)表達式和一個賓語(object)表達式。XPath 表達式允許您在文檔中定義一個節點關系集,并允許根據這些關系從文檔返回內容的子集。當在資源庫中添加、修改和刪除每個 XML 文檔時,都要根據 XML 文檔求這些 XPath 表達式的值。求得的語句,也被稱為 三元組(triple),被自動添加到 RDF 數據庫(被稱作 模型)中,或從其中刪除。如果修改了文檔,也要更改元組以反映發生的更改,如果文檔被刪除了,就要把元組從 RDF 服務器上刪除。文檔定義可以從其它文檔繼承定義的信息,這允許您定義 XML 內容到 RDF 元數據信息的復雜映射。
在我們的示例應用程序中,我們將擴展其中一個缺省文檔定義。缺省文檔定義描述了嵌入在 XML 內容中的 Dublin Core 標記到 Dublin Core 語句的映射。Dublin Core 是一個元數據倡議,它定義了基于 Web 的通用對象(例如, Creator 、 Title 和 Date )的一組標準屬性。派生出的文檔定義將為每個文檔再添加一條語句。
如下所示,一個簡單的聲明將把這個文檔的 Creator 元數據設置為求得的某個 XPath 的結果:
RdfStatement(subject='$uri', predicate="http://purl.org/dc/elements/1.1#Title", object="/rdf:RDF/s:Software/dc:Creator")
(上面的代碼是一個單行語句,但是為了適合這個格式進行了縮排。)
為了添加或更新系統缺省數據,您應該運行 4SS 自帶的腳本 populate.py 。這樣將從 ftp://ftp.fourthought.com下載有用的數據來更新您的服務器。下載的數據包含一些常用的項,如 Dublin Core 文檔定義和 Docbook 樣式表(Docbook 是技術文檔流行的 XML 格式)。
在安裝 4SS 時,植入腳本將自動安裝在演示應用程序中。在基于 Unix 的機器上,植入腳本一般存儲在 /usr/doc/4SuiteServer-0.11 或 /usr/local/doc/4SuiteServer-0.11 中。在 Windows 機器上,存儲目錄一般是 c:\Program Files\Python 或 c:\Python20 。 清單 2展示了植入您的基于 4SS 的應用程序的安裝過程。
清單 2:植入 4SS 應用程序
Downloading XML Documents
Downloading Stylesheets
Downloading DocDefs
Adding XML document: 'null'
Adding stylesheet: 'docbook_html1.xslt'
Adding stylesheet: 'presentation_toc.xslt'
Adding stylesheet: 'presentation.xslt'
Adding stylesheet: 'docbook_text1.xslt'
Adding document definition: 'dublin_core'
Adding document definition: 'docbook1'
接下來,我們必須為軟件條目清單創建一個文檔定義。為了添加定義,我們使用命令行腳本 4ss deserialize docdef ,將序列化的文檔定義的文件名作為唯一的參數來傳遞。例如:
內容
我們將從命令行用 4ss create document 給系統添加新內容。在下載示例中,有兩個軟件清單,它們是名為 software1.rdf 和 software2.rdf 的 XML 文件。為了把這些文件添加到系統中,我們執行 4ss create document ,為它指定要使用的文檔定義、要添加的文件的名稱以及要賦予系統內資源的一列別名。
首先,我們要為我們服務器上的軟件資源庫創建一個容器,把容器的許可權設置成允許“uo”組有寫訪問權限,并允許所有人進行讀訪問(因為我們想要從這個目錄提供 Web 頁面):
[molson@penny example]$ 4ss set acl --write=uo --world-read /softrepo
然后,我們把我們的樣本下載文件添加到資源庫中。盡管 4SS 資源庫可以以任意格式存儲很多數據,但是它針對存儲 XML 數據進行了高度優化。當我們把 .tar 文件添加到資源庫中時,我們指定 --imt 選項來設置文件的因特網媒體類型(Internet Media Type,IMT)(在這里是 application/x-gzip )。這個 IMT 除了其它作用,還可以被 HTTP 服務器用于檢索 Web 上的內容。請注意,IMT 有時也叫“MIME 類型”。請參閱 清單 3,以了解添加內容的命令。請注意,在一個更復雜的項目中,您可以考慮把二進制文件放在一個單獨的容器中。
取內容
取內容就和添加內容一樣簡單。不過,我們首先一定要將樣式表添加到資源庫中。我們的示例文件包含了一個非常簡單的樣式表。為了添加它,您可以使用 4ss create document ,并為其取別名為 software.xslt 。例如:
BASE_XSLT 是一個特殊的文檔定義,它告訴 4SS 將這個文檔作為一個 XSLT 樣式表來進行優化。
添加文檔之后,您現在可以用您的 Web 瀏覽器連接到 4SS HTTP 服務器(支持普通的 Python 和 Apache 服務器)上,然后轉到 http://localhost:8080/softrepo/pong.xml 頁面。這將從資源庫中取出 pong 軟件描述文檔。如果您正在使用一個支持 IMT text/xml 的瀏覽器(如 Internet Explorer 或 Mozilla),那么您就可以查看已添加到資源庫中的 XML。要告訴 HTTP 偵聽器(HTTP Listener)您想在頁面被返回之前處理頁面(通過在 XSLT 中運行),請指定 xslt URI 查詢參數 http://localhost/softrepo/pong.xml?xslt=software.xslt 。
請注意,頁面上下載包的鏈接也指向 localhost。這個鏈接還將檢查 HTTP 偵聽器,并取出我們為 pong-0.0.2.tgz 添加的資源。當它被返回到瀏覽器時,它會指定我們把資源添加到系統時所定義的 IMT。
生成索引頁
為了生成索引頁,我們將使用 4SS 的一些擴展函數,以使 XSLT 訪問 RDF 模型。對于在 4SS 中生成一個索引頁的問題,還有其它的解決方案。其中一種解決方案是用 Python 為 HTTP GET 消息寫一個定制處理程序。這樣做可能在請求 index.html 時需要查詢 RDF 模型。另一個解決方案是,每當將一個新文檔添加到系統中或者從系統中刪除一個文件時,都使用 4SS 事件系統來更新 index.html 文檔。
因為 XSLT 總是需要根據一個源文檔而被應用,所以我們將給系統添加一個啞源文檔。在下載示例中有一個叫 index.doc 的源文檔。請用 4ss create document 將這個文檔添加到資源庫中,如下所示:
[molson@penny example]$ 4ss set acl --world-read softrepo/index.doc
我們將在樣式表中使用擴展函數 rdf.complete 來收集關于系統中所有軟件的信息。擴展函數調用 RDF 模型上的 complete 方法。 complete 方法允許您搜索 RDF 模型以找到一個匹配指定模式的語句。該方法最多要用三個參數:一個 subject 、一個 predicate 和一個可選的 object 。這些參數都可以是空字符串。它將返回匹配所有指定值的一列語句。例如,如果您輸入主語 foo,賓語 bar,將返回有主語 foo,任意謂語以及賓語 bar 的語句。
4SS 自動創建把文檔鏈接到文檔定義上的 RDF 語句。這些語句的主語是文檔的 URI,謂語是 http://schemas.4suite.org/4ss#metaxml.docdef ,賓語是文檔定義名。知道了這一點,我們就可以用一個簡單的 complete 調用指定謂語和賓語,用 software 文檔定義在我們的系統中獲得一個文檔列表。
我們用來生成索引的樣式表叫 index.xslt 。與源文檔根目錄匹配的模板首先調用了 rdf.complete 。這個函數調用在 RDF 模型上為所有將 http://schemas.4suite.org/4ss#metaxml.docdef 作為謂語,將 software 作為賓語的語句進行了一次 complete 操作。 rdf.complete 函數調用的結果是 Statement 元素的一個節點集。每個 Statement 元素有三個子元素: Subject 、 Predicate 和 Object 。如 清單 4 所示,我們根據函數的結果使用 xsl:apply-templates ,并且顯示模板內每個在 Statement 上匹配的軟件項。
為了查看生成的索引頁,請將您的瀏覽器轉到 http://localhost:8080/softrepo/index.doc?xslt=index.xslt 。
然而,這個索引并不是一成不變的,我們很容易就能夠明白如何將這個簡單的頁擴展為以任何風格顯示軟件標題。我們可以在樣式表中修改顯示每一項所用的方式,還可以通過向文檔定義添加更多的映射來調整可用于樣式表的數據。
結束語
哦,我們還是沒有編寫任何 Python 代碼,但是我們確實粗略了解了一下 4Suite Server 的一些功能。在下個月的專欄中,我們將在本示例的基礎上加以擴展,讓軟件資源庫具有內容管理的功能,并能夠搜索生成的所有元數據。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
