Python中的XML庫4Suite Server的介紹
在繼續(xù)閱讀本文之前,您務(wù)必要對(duì)我們?cè)诒緦谥袑⒁懻摰囊恍┘夹g(shù)有所了解。我們要使用的技術(shù)包括:可擴(kuò)展的樣式表語言轉(zhuǎn)換(Extensible Stylesheet Language Transformations,XSLT)、XML 路徑語言(XML Path Language,XPath)和資源描述框架(Resource Description Framework,RDF)。在 參考資料部分有到關(guān)于所有這些技術(shù)的信息的鏈接。
4Suite Server 概述
我們將使用由本文作者參與開發(fā)的 XML 資源庫 4Suite Server(4SS)作為本文中示例的應(yīng)用程序基礎(chǔ)。4Suite Server 是一個(gè) XML 資源庫,它帶有許多用于 XML 數(shù)據(jù)和元數(shù)據(jù)管理的功能程序,無論使用 Python 與否,這些功能程序都使得 4Suite Server 非常適合 Web 服務(wù)的快速開發(fā)。
本文中的示例是用 4Suite Server 0.11 編寫的,需要使用 Python 1.5.2 或更高版本和 4Suite 0.11。在 參考資料部分有下載所有這些應(yīng)用程序的鏈接。
在線軟件資源庫
本文是“Python Web Services Developer”專欄的第二部分,卻是關(guān)于構(gòu)建在線軟件資源庫的三部分系列的第一部分。在這部分中,我們將構(gòu)建我們的基礎(chǔ)架構(gòu)。在隨后的專欄中,我們將特別描述如何使用各種協(xié)議(例如,簡(jiǎn)單對(duì)象訪問協(xié)議(Simple Object Access Protocol,SOAP)、HTTP 和 WWW 分布式編寫和版本控制(WWW Distributed Authoring and Versioning,WebDAV))搜索建立了索引的內(nèi)容和基于代理的內(nèi)容添加或內(nèi)容檢索。
我們的在線軟件資源庫服務(wù)模式是基于 RPMFind.net 中的 RDF 模式的,但關(guān)系不太緊密。RPMFind 是一個(gè)用流行的 Red Hat 包管理器(Red Hat Package Manager,RPM)格式為 UNIX 和 Linux 軟件包編制目錄的系統(tǒng)。它包含關(guān)于軟件包的關(guān)鍵元數(shù)據(jù)(包括作者、版本和描述,格式為 RDF,詳見 清單 1)。關(guān)于 RDF 的簡(jiǎn)短定義,請(qǐng)閱讀本專欄的前一期,或者去 參考資料部分查找這個(gè)簡(jiǎn)單格式基本介紹的鏈接。
XML 的實(shí)際格式是不相關(guān)的。事實(shí)上,因?yàn)樗枋龅募夹g(shù)適用于任何類型的 XML 內(nèi)容,所以根本沒必要去描述軟件。您可以用這種技術(shù)描述書的目錄、雇員信息,或者甚至是餐館的酒類一覽表。
這個(gè)示例中使用的所有代碼和數(shù)據(jù)文件都可以從 參考資料部分的鏈接下載。
文檔定義
在 4SS 的 XML 資源庫中,文檔定義允許您指定 XML 內(nèi)容和 RDF 元數(shù)據(jù)之間的一個(gè)映射。為此,您需要定義由三個(gè) XPath 表達(dá)式組成的集:一個(gè)主語(subject)表達(dá)式、一個(gè)謂語(predicate)表達(dá)式和一個(gè)賓語(object)表達(dá)式。XPath 表達(dá)式允許您在文檔中定義一個(gè)節(jié)點(diǎn)關(guān)系集,并允許根據(jù)這些關(guān)系從文檔返回內(nèi)容的子集。當(dāng)在資源庫中添加、修改和刪除每個(gè) XML 文檔時(shí),都要根據(jù) XML 文檔求這些 XPath 表達(dá)式的值。求得的語句,也被稱為 三元組(triple),被自動(dòng)添加到 RDF 數(shù)據(jù)庫(被稱作 模型)中,或從其中刪除。如果修改了文檔,也要更改元組以反映發(fā)生的更改,如果文檔被刪除了,就要把元組從 RDF 服務(wù)器上刪除。文檔定義可以從其它文檔繼承定義的信息,這允許您定義 XML 內(nèi)容到 RDF 元數(shù)據(jù)信息的復(fù)雜映射。
在我們的示例應(yīng)用程序中,我們將擴(kuò)展其中一個(gè)缺省文檔定義。缺省文檔定義描述了嵌入在 XML 內(nèi)容中的 Dublin Core 標(biāo)記到 Dublin Core 語句的映射。Dublin Core 是一個(gè)元數(shù)據(jù)倡議,它定義了基于 Web 的通用對(duì)象(例如, Creator 、 Title 和 Date )的一組標(biāo)準(zhǔn)屬性。派生出的文檔定義將為每個(gè)文檔再添加一條語句。
如下所示,一個(gè)簡(jiǎn)單的聲明將把這個(gè)文檔的 Creator 元數(shù)據(jù)設(shè)置為求得的某個(gè) XPath 的結(jié)果:
RdfStatement(subject='$uri', predicate="http://purl.org/dc/elements/1.1#Title", object="/rdf:RDF/s:Software/dc:Creator")
(上面的代碼是一個(gè)單行語句,但是為了適合這個(gè)格式進(jìn)行了縮排。)
為了添加或更新系統(tǒng)缺省數(shù)據(jù),您應(yīng)該運(yùn)行 4SS 自帶的腳本 populate.py 。這樣將從 ftp://ftp.fourthought.com下載有用的數(shù)據(jù)來更新您的服務(wù)器。下載的數(shù)據(jù)包含一些常用的項(xiàng),如 Dublin Core 文檔定義和 Docbook 樣式表(Docbook 是技術(shù)文檔流行的 XML 格式)。
在安裝 4SS 時(shí),植入腳本將自動(dòng)安裝在演示應(yīng)用程序中。在基于 Unix 的機(jī)器上,植入腳本一般存儲(chǔ)在 /usr/doc/4SuiteServer-0.11 或 /usr/local/doc/4SuiteServer-0.11 中。在 Windows 機(jī)器上,存儲(chǔ)目錄一般是 c:\Program Files\Python 或 c:\Python20 。 清單 2展示了植入您的基于 4SS 的應(yīng)用程序的安裝過程。
清單 2:植入 4SS 應(yīng)用程序
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'
接下來,我們必須為軟件條目清單創(chuàng)建一個(gè)文檔定義。為了添加定義,我們使用命令行腳本 4ss deserialize docdef ,將序列化的文檔定義的文件名作為唯一的參數(shù)來傳遞。例如:
內(nèi)容
我們將從命令行用 4ss create document 給系統(tǒng)添加新內(nèi)容。在下載示例中,有兩個(gè)軟件清單,它們是名為 software1.rdf 和 software2.rdf 的 XML 文件。為了把這些文件添加到系統(tǒng)中,我們執(zhí)行 4ss create document ,為它指定要使用的文檔定義、要添加的文件的名稱以及要賦予系統(tǒng)內(nèi)資源的一列別名。
首先,我們要為我們服務(wù)器上的軟件資源庫創(chuàng)建一個(gè)容器,把容器的許可權(quán)設(shè)置成允許“uo”組有寫訪問權(quán)限,并允許所有人進(jìn)行讀訪問(因?yàn)槲覀兿胍獜倪@個(gè)目錄提供 Web 頁面):
[molson@penny example]$ 4ss set acl --write=uo --world-read /softrepo
然后,我們把我們的樣本下載文件添加到資源庫中。盡管 4SS 資源庫可以以任意格式存儲(chǔ)很多數(shù)據(jù),但是它針對(duì)存儲(chǔ) XML 數(shù)據(jù)進(jìn)行了高度優(yōu)化。當(dāng)我們把 .tar 文件添加到資源庫中時(shí),我們指定 --imt 選項(xiàng)來設(shè)置文件的因特網(wǎng)媒體類型(Internet Media Type,IMT)(在這里是 application/x-gzip )。這個(gè) IMT 除了其它作用,還可以被 HTTP 服務(wù)器用于檢索 Web 上的內(nèi)容。請(qǐng)注意,IMT 有時(shí)也叫“MIME 類型”。請(qǐng)參閱 清單 3,以了解添加內(nèi)容的命令。請(qǐng)注意,在一個(gè)更復(fù)雜的項(xiàng)目中,您可以考慮把二進(jìn)制文件放在一個(gè)單獨(dú)的容器中。
取內(nèi)容
取內(nèi)容就和添加內(nèi)容一樣簡(jiǎn)單。不過,我們首先一定要將樣式表添加到資源庫中。我們的示例文件包含了一個(gè)非常簡(jiǎn)單的樣式表。為了添加它,您可以使用 4ss create document ,并為其取別名為 software.xslt 。例如:
BASE_XSLT 是一個(gè)特殊的文檔定義,它告訴 4SS 將這個(gè)文檔作為一個(gè) XSLT 樣式表來進(jìn)行優(yōu)化。
添加文檔之后,您現(xiàn)在可以用您的 Web 瀏覽器連接到 4SS HTTP 服務(wù)器(支持普通的 Python 和 Apache 服務(wù)器)上,然后轉(zhuǎn)到 http://localhost:8080/softrepo/pong.xml 頁面。這將從資源庫中取出 pong 軟件描述文檔。如果您正在使用一個(gè)支持 IMT text/xml 的瀏覽器(如 Internet Explorer 或 Mozilla),那么您就可以查看已添加到資源庫中的 XML。要告訴 HTTP 偵聽器(HTTP Listener)您想在頁面被返回之前處理頁面(通過在 XSLT 中運(yùn)行),請(qǐng)指定 xslt URI 查詢參數(shù) http://localhost/softrepo/pong.xml?xslt=software.xslt 。
請(qǐng)注意,頁面上下載包的鏈接也指向 localhost。這個(gè)鏈接還將檢查 HTTP 偵聽器,并取出我們?yōu)?pong-0.0.2.tgz 添加的資源。當(dāng)它被返回到瀏覽器時(shí),它會(huì)指定我們把資源添加到系統(tǒng)時(shí)所定義的 IMT。
生成索引頁
為了生成索引頁,我們將使用 4SS 的一些擴(kuò)展函數(shù),以使 XSLT 訪問 RDF 模型。對(duì)于在 4SS 中生成一個(gè)索引頁的問題,還有其它的解決方案。其中一種解決方案是用 Python 為 HTTP GET 消息寫一個(gè)定制處理程序。這樣做可能在請(qǐng)求 index.html 時(shí)需要查詢 RDF 模型。另一個(gè)解決方案是,每當(dāng)將一個(gè)新文檔添加到系統(tǒng)中或者從系統(tǒng)中刪除一個(gè)文件時(shí),都使用 4SS 事件系統(tǒng)來更新 index.html 文檔。
因?yàn)?XSLT 總是需要根據(jù)一個(gè)源文檔而被應(yīng)用,所以我們將給系統(tǒng)添加一個(gè)啞源文檔。在下載示例中有一個(gè)叫 index.doc 的源文檔。請(qǐng)用 4ss create document 將這個(gè)文檔添加到資源庫中,如下所示:
[molson@penny example]$ 4ss set acl --world-read softrepo/index.doc
我們將在樣式表中使用擴(kuò)展函數(shù) rdf.complete 來收集關(guān)于系統(tǒng)中所有軟件的信息。擴(kuò)展函數(shù)調(diào)用 RDF 模型上的 complete 方法。 complete 方法允許您搜索 RDF 模型以找到一個(gè)匹配指定模式的語句。該方法最多要用三個(gè)參數(shù):一個(gè) subject 、一個(gè) predicate 和一個(gè)可選的 object 。這些參數(shù)都可以是空字符串。它將返回匹配所有指定值的一列語句。例如,如果您輸入主語 foo,賓語 bar,將返回有主語 foo,任意謂語以及賓語 bar 的語句。
4SS 自動(dòng)創(chuàng)建把文檔鏈接到文檔定義上的 RDF 語句。這些語句的主語是文檔的 URI,謂語是 http://schemas.4suite.org/4ss#metaxml.docdef ,賓語是文檔定義名。知道了這一點(diǎn),我們就可以用一個(gè)簡(jiǎn)單的 complete 調(diào)用指定謂語和賓語,用 software 文檔定義在我們的系統(tǒng)中獲得一個(gè)文檔列表。
我們用來生成索引的樣式表叫 index.xslt 。與源文檔根目錄匹配的模板首先調(diào)用了 rdf.complete 。這個(gè)函數(shù)調(diào)用在 RDF 模型上為所有將 http://schemas.4suite.org/4ss#metaxml.docdef 作為謂語,將 software 作為賓語的語句進(jìn)行了一次 complete 操作。 rdf.complete 函數(shù)調(diào)用的結(jié)果是 Statement 元素的一個(gè)節(jié)點(diǎn)集。每個(gè) Statement 元素有三個(gè)子元素: Subject 、 Predicate 和 Object 。如 清單 4 所示,我們根據(jù)函數(shù)的結(jié)果使用 xsl:apply-templates ,并且顯示模板內(nèi)每個(gè)在 Statement 上匹配的軟件項(xiàng)。
為了查看生成的索引頁,請(qǐng)將您的瀏覽器轉(zhuǎn)到 http://localhost:8080/softrepo/index.doc?xslt=index.xslt 。
然而,這個(gè)索引并不是一成不變的,我們很容易就能夠明白如何將這個(gè)簡(jiǎn)單的頁擴(kuò)展為以任何風(fēng)格顯示軟件標(biāo)題。我們可以在樣式表中修改顯示每一項(xiàng)所用的方式,還可以通過向文檔定義添加更多的映射來調(diào)整可用于樣式表的數(shù)據(jù)。
結(jié)束語
哦,我們還是沒有編寫任何 Python 代碼,但是我們確實(shí)粗略了解了一下 4Suite Server 的一些功能。在下個(gè)月的專欄中,我們將在本示例的基礎(chǔ)上加以擴(kuò)展,讓軟件資源庫具有內(nèi)容管理的功能,并能夠搜索生成的所有元數(shù)據(jù)。
相關(guān)文章
Python?使用?pip?安裝?matplotlib?模塊的方法
matplotlib是python中強(qiáng)大的畫圖模塊,這篇文章主要介紹了Python?使用?pip?安裝?matplotlib?模塊(秒解版),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開始
這篇文章主要介紹了安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開始強(qiáng)制使用 ChartItem 進(jìn)行數(shù)據(jù)項(xiàng)配置 ”的解決方法,需要的朋友可以參考下2020-08-08
基于python介紹pytorch保存和恢復(fù)參數(shù)
這篇文章主要介紹了基于python介紹pytorch保存和恢復(fù)參數(shù),為了恢復(fù)模型,我們需要用代碼生成框架,然后從磁盤加載參數(shù),下面具體的相關(guān)介紹,需要的小伙伴可以參考一下2022-03-03
一篇文章帶你學(xué)習(xí)python的函數(shù)與類
這篇文章主要為大家介紹了python的函數(shù)與類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01
用Python復(fù)現(xiàn)二戰(zhàn)德軍enigma密碼機(jī)
大家好,本篇文章主要講的是用Python復(fù)現(xiàn)二戰(zhàn)德軍enigma密碼機(jī),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01
Python數(shù)據(jù)處理的六種方式總結(jié)
在 Python 的數(shù)據(jù)處理方面經(jīng)常會(huì)用到一些比較常用的數(shù)據(jù)處理方式,比如pandas、numpy等等。今天介紹的這款 Python 數(shù)據(jù)處理的管道數(shù)據(jù)處理方式,通過鏈?zhǔn)胶瘮?shù)的方式可以輕松的完成對(duì)list列表數(shù)據(jù)的處理,希望對(duì)大家有所幫助2022-11-11

