Python中的XML库4Suite Server的介绍
在继续阅读本文之前,您务必要对我们在本专栏中将要讨论的一些技术有所了解。我们要使用的技术包括:可扩展的样式表语言转换(ExtensibleStylesheetLanguageTransformations,XSLT)、XML路径语言(XMLPathLanguage,XPath)和资源描述框架(ResourceDescriptionFramework,RDF)。在参考资料部分有到关于所有这些技术的信息的链接。
4SuiteServer概述
我们将使用由本文作者参与开发的XML资源库4SuiteServer(4SS)作为本文中示例的应用程序基础。4SuiteServer是一个XML资源库,它带有许多用于XML数据和元数据管理的功能程序,无论使用Python与否,这些功能程序都使得4SuiteServer非常适合Web服务的快速开发。
本文中的示例是用4SuiteServer0.11编写的,需要使用Python1.5.2或更高版本和4Suite0.11。在参考资料部分有下载所有这些应用程序的链接。
在线软件资源库
本文是“PythonWebServicesDeveloper”专栏的第二部分,却是关于构建在线软件资源库的三部分系列的第一部分。在这部分中,我们将构建我们的基础架构。在随后的专栏中,我们将特别描述如何使用各种协议(例如,简单对象访问协议(SimpleObjectAccessProtocol,SOAP)、HTTP和WWW分布式编写和版本控制(WWWDistributedAuthoringandVersioning,WebDAV))搜索建立了索引的内容和基于代理的内容添加或内容检索。
我们的在线软件资源库服务模式是基于RPMFind.net中的RDF模式的,但关系不太紧密。RPMFind是一个用流行的RedHat包管理器(RedHatPackageManager,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内容中的DublinCore标记到DublinCore语句的映射。DublinCore是一个元数据倡议,它定义了基于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下载有用的数据来更新您的服务器。下载的数据包含一些常用的项,如DublinCore文档定义和Docbook样式表(Docbook是技术文档流行的XML格式)。
在安装4SS时,植入脚本将自动安装在演示应用程序中。在基于Unix的机器上,植入脚本一般存储在/usr/doc/4SuiteServer-0.11或/usr/local/doc/4SuiteServer-0.11中。在Windows机器上,存储目录一般是c:\ProgramFiles\Python或c:\Python20。清单2展示了植入您的基于4SS的应用程序的安装过程。
清单2:植入4SS应用程序
[molson@pennyexample]$python/usr/doc/4SuiteServer-0.11/demo/populate.py DownloadingXMLDocuments DownloadingStylesheets DownloadingDocDefs AddingXMLdocument:'null' Addingstylesheet:'docbook_html1.xslt' Addingstylesheet:'presentation_toc.xslt' Addingstylesheet:'presentation.xslt' Addingstylesheet:'docbook_text1.xslt' Addingdocumentdefinition:'dublin_core' Addingdocumentdefinition:'docbook1'
接下来,我们必须为软件条目清单创建一个文档定义。为了添加定义,我们使用命令行脚本4ssdeserializedocdef,将序列化的文档定义的文件名作为唯一的参数来传递。例如:
[molson@pennyexample]$4ssdeserializedocdefsoftware.docdef
内容
我们将从命令行用4sscreatedocument给系统添加新内容。在下载示例中,有两个软件清单,它们是名为software1.rdf和software2.rdf的XML文件。为了把这些文件添加到系统中,我们执行4sscreatedocument,为它指定要使用的文档定义、要添加的文件的名称以及要赋予系统内资源的一列别名。
首先,我们要为我们服务器上的软件资源库创建一个容器,把容器的许可权设置成允许“uo”组有写访问权限,并允许所有人进行读访问(因为我们想要从这个目录提供Web页面):
[molson@pennyexample]$4sscreatecontainer/softrepo [molson@pennyexample]$4sssetacl--write=uo--world-read/softrepo
然后,我们把我们的样本下载文件添加到资源库中。尽管4SS资源库可以以任意格式存储很多数据,但是它针对存储XML数据进行了高度优化。当我们把.tar文件添加到资源库中时,我们指定--imt选项来设置文件的因特网媒体类型(InternetMediaType,IMT)(在这里是application/x-gzip)。这个IMT除了其它作用,还可以被HTTP服务器用于检索Web上的内容。请注意,IMT有时也叫“MIME类型”。请参阅清单3,以了解添加内容的命令。请注意,在一个更复杂的项目中,您可以考虑把二进制文件放在一个单独的容器中。
取内容
取内容就和添加内容一样简单。不过,我们首先一定要将样式表添加到资源库中。我们的示例文件包含了一个非常简单的样式表。为了添加它,您可以使用4sscreatedocument,并为其取别名为software.xslt。例如:
[molson@pennyexample]$4sscreatedocumentBASE_XSLTsoftware.xsltsoftrepo/software.xslt
BASE_XSLT是一个特殊的文档定义,它告诉4SS将这个文档作为一个XSLT样式表来进行优化。
添加文档之后,您现在可以用您的Web浏览器连接到4SSHTTP服务器(支持普通的Python和Apache服务器)上,然后转到http://localhost:8080/softrepo/pong.xml页面。这将从资源库中取出pong软件描述文档。如果您正在使用一个支持IMTtext/xml的浏览器(如InternetExplorer或Mozilla),那么您就可以查看已添加到资源库中的XML。要告诉HTTP侦听器(HTTPListener)您想在页面被返回之前处理页面(通过在XSLT中运行),请指定xsltURI查询参数http://localhost/softrepo/pong.xml?xslt=software.xslt。
请注意,页面上下载包的链接也指向localhost。这个链接还将检查HTTP侦听器,并取出我们为pong-0.0.2.tgz添加的资源。当它被返回到浏览器时,它会指定我们把资源添加到系统时所定义的IMT。
生成索引页
为了生成索引页,我们将使用4SS的一些扩展函数,以使XSLT访问RDF模型。对于在4SS中生成一个索引页的问题,还有其它的解决方案。其中一种解决方案是用Python为HTTPGET消息写一个定制处理程序。这样做可能在请求index.html时需要查询RDF模型。另一个解决方案是,每当将一个新文档添加到系统中或者从系统中删除一个文件时,都使用4SS事件系统来更新index.html文档。
因为XSLT总是需要根据一个源文档而被应用,所以我们将给系统添加一个哑源文档。在下载示例中有一个叫index.doc的源文档。请用4sscreatedocument将这个文档添加到资源库中,如下所示:
[molson@pennyexample]$4sscreatedocumentindex.docBASE_XMLsoftrepo/index.doc [molson@pennyexample]$4sssetacl--world-readsoftrepo/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代码,但是我们确实粗略了解了一下4SuiteServer的一些功能。在下个月的专栏中,我们将在本示例的基础上加以扩展,让软件资源库具有内容管理的功能,并能够搜索生成的所有元数据。