IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  XML | Open source  >

技巧: 使用 PHP 解析 RDDL 文档

用 PHP 解析和提取 RDDL 资源信息

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论

英文原文

英文原文


级别: 中级

Vikram Vaswani, 创始人, Melonfire

2007 年 12 月 24 日

资源目录描述语言(Resource Directory Description Language,RDDL)允许文档作者提供关于 XHTML 文档中所用资源的更多信息。使用 PEAR 提供的 XML_RDDL 包中的 API 解析这些 RDDL 描述符,提取可用于 PHP 应用程序的资源信息。

简介

如果曾经使用过 XML,应该知道名称空间 通过与特定 URI 关联来限定 XML 元素名称,从而避免同名元素冲突。但通常仅仅一个 URI 还不够,实际上我们需要一种办法使用多种资源来描述名称空间,包括 DTD、XML 模式、XSL 样式表和软件文档。

于是资源目录描述语言 RDDL 登台亮相了。正如这种语言的官方网站所说,RDDL “提供了关于一些目标的信息包……目标是 XML 名称空间”(请参阅 参考资料)。RDDL 允许文档作者为用户提供关于特定资源的更多信息。帮助 PHP 开发人员利用这些信息的是 XML_RDDL,PHP Extension and Application Repository (PEAR) 提供的一个包。XML_RDDL 包提供了从 RDDL 文件中提取各种资源信息并在 PHP 应用程序中使用的 API。从而为 PHP/RDDL 应用程序提供了一种健壮、简单易用的构件。





回页首


安装

XML_RDDL 包由 Stephan Schmidt 维护,采用 PHP 许可证在 PHP 社区发布。最简单的安装办法是用自动化的 PEAR 安装程序,应该包含在默认的 PHP 安装包中。安装只需在 shell 提示符下输入下列命令:

shell> pear install XML_RDDL

PEAR 安装程序连接到 PEAR 包服务器并下载程序包,然后安装到系统的适当位置。本技巧使用的是 XML_RDDL V 0.9。

如果手工安装,可以访问主页并下源代码压缩包,然后手工解压到指定位置。需要注意的是手工安装必须对 PEAR 程序包的组织结构有所了解。

XML_RDDL 还需要另一个 PEAR 包,即 XML_Parser 包。可以按照上述方法使用 PEAR 自动安装程序安装它,也可在本文 参考资料 部分找到包的链接。





回页首


理解 RDDL 描述符

首先必须对 RDDL 有所了解。清单 1 中的例子说明了 RDDL 的用法:


清单 1. 使用 RDDL 的 XHTML 文档
                        
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink" 
xmlns:rddl="http://www.rddl.org/" xml:lang="en">
 <head>
 <title>An Example RDDL Document</title>
 </head>
 <body>
 <h2>An Example RDDL Document</h2>
 <p>Here are some resources:</p>
 <ul>
 <li>
 <rddl:resource xlink:type="simple" 
 xlink:href="http://app.example.domain/example.xsd" 
 xlink:role="http://www.w3.org/2000/10/XMLSchema" 
 xlink:title="Example XML Schema" 
 xlink:arcrole="http://www.rddl.org/purposes#schema-validation"> 
 <a href="http://app.example.domain/example.xslt">An Example XML Schema</a> 
 </rddl:resource>
 </li>
 <li>
 <rddl:resource id="dtd" xlink:type="simple" 
 xlink:href="http://app.example.domain/example.dtd" 
 xlink:role="http://www.isi.edu/in-notes/iana/assignments/media-types/
 application/xml-dtd" 
 xlink:title="Example DTD" 
 xlink:arcrole="http://www.rddl.org/purposes#validation"> 
 <a href="http://app.example.domain/example.dtd">An Example DTD</a> 
 </rddl:resource>
 </li>
 <li>
 <rddl:resource xlink:type="simple" 
 xlink:href="http://app.example.domain/api.html" 
 xlink:role="http://www.w3.org/1999/xhtml" 
 xlink:title="Example API Reference" 
 xlink:arcrole="http://www.rddl.org/purposes#reference"> 
 <a href="http://app.example.domain/api.html">An Example API Reference</a> 
 </rddl:resource>
 </li>
 <li>
 <rddl:resource xlink:type="simple" 
 xlink:href="http://app.example.com/video.mpg" 
 xlink:role="http://www.isi.edu/in-notes/iana/assignments/media-types/video/mpeg" 
 xlink:title="Explanatory Video" 
 xlink:arcrole="http://www.rddl.org/purposes#software-package"> 
 <a href="http://app.example.com/video.mpg">Explanatory Video</a> 
 </rddl:resource>
 </li>
 <li>
 <rddl:resource xlink:type="simple" 
 xlink:href="http://app.example.com/video2.mpg" 
 xlink:role="http://www.isi.edu/in-notes/iana/assignments/media-types/video/mpeg" 
 xlink:title="Explanatory Video 2" 
 xlink:arcrole="http://www.rddl.org/purposes#software-package"> 
 <a href="http://app.example.com/video2.mpg">Explanatory Video</a> 
 </rddl:resource>
 </li>
 </ul>
 </body>
</html>
 

清单 1 所示,RDDL 文档就是一般的 XHTML 文档,只不过增加了 <resource> 元素,用于描述文档中引用的资源。这个 <resource> 元素用 XLink 修饰,包括描述资源标题、目标、角色和用途的属性。上述文档列出了多种资源:包括 DTD、XML Schema、XHTML 文档,还有两个 MPEG 媒体文件。

<resource> 的属性中,titlehref 很简单,分别提供了字符串描述和链接目标的 URL。<resource> 元素的 rolearcrole 属性稍微复杂一点。role 属性描述了资源的性质,必须是指向资源名称空间或者引用资源 MIME 类型的 URI,http://www.rddl.org/natures/ 列出了常见的性质。arcrole 属性指定了资源的用途,参见 http://www.rddl.org/purposes/

上述内容对于 RDDL 1.0 来说是对的。但是 2004 年 1 月发布了 RDDL 规范的更新草案 RDDL 2.0,取消了 <resource> 元素及其属性。该规范建议使用新属性 naturepurpose 将 RDDL 信息内嵌在标准 XHTML <a> 元素中,这两个属性相当于原来 <resource> 元素中 rolearcrole 属性。但是,XML_RDDL 包不支持 RDDL 2.0,因此本文中的例子仅适用于 RDDL 1.0。





回页首


使用 PHP 访问 RDDL 信息

得到包含 RDDL 资源定义的 XHTML 文档之后,使用 XML_RDDL 访问其中的各类信息很简单。清单 2 示范了使用 PHP 从 XHTML 文档中检索全部 RDDL 资源的过程:


清单 2. 使用 PHP 解析 RDDL 数据
                        
<?php
// include class file
include 'XML/RDDL.php';

// create RDDL parser
// parse RDDL file
$rddl = new XML_RDDL();
$rddl->parseRDDL('example.html');

// print array of resources 
print_r($rddl->getAllResources());
?>
 

清单 2 使用 PHP XML_RDDL 包读取 清单 1 所示的 XHTML 文档并检索所有的资源。首先读入 XML_RDDL 类文件,初始化 XML_RDDL 类的一个实例。然后用该类的 parseRDDL() 方法解析源文件(可以是本地文件或者远程 URL)。文档解析之后,getAllResources() 方法用关联数组返回文档中所有的 <resource> 元素列表。

清单 3 显示了 清单 2 输出结果的片断:


清单 3. 清单 2 的输出结果
                        
Array
(
 [0] => Array
 (
 [lang] => en
 [type] => simple
 [href] => http://app.example.domain/example.xsd
 [role] => http://www.w3.org/2000/10/XMLSchema
 [title] => Example XML Schema
 [arcrole] => http://www.rddl.org/purposes#schema-validation
 )

 [1] => Array
 (
 [lang] => en
 [type] => simple
 [id] => dtd
 [href] => http://app.example.domain/example.dtd
 [role] => http://www.isi.edu/in-notes/iana/assignments/media-types/
 application/xml-dtd
 [title] => Example DTD
 [arcrole] => http://www.rddl.org/purposes#validation
 ) 
 ...
)
 

利用 PHP foreach() 循环很容易改变数组的格式,以用 HTML 显示出来。清单 4 示范了这个过程,结果如 图 1 所示。


清单 4. 将 RDDL 数据格式化为表格
                        
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <title></title>
 <style type="text/css">
 table {
 width:100%;
 border-collapse:collapse;
 }
 td {
 border: solid 1px black; 
 padding: 5px; 
 }
 </style>
 </head>
 <body>
 <h2>Resources</h2>
<?php
// include class file
include 'XML/RDDL.php';

// create RDDL parser
// parse RDDL file
$rddl = new XML_RDDL();
$rddl->parseRDDL('example.html');

// get all resources as array
// format as table
$resources = $rddl->getAllResources();
if (is_array($resources) && count($resources) > 0) {
?>
 <table> 
 <tr>
 <td>Resource</td> 
 <td>Description</td>
 <td>Purpose</td> 
 <td>Role</td>
 </tr>
<?php 
 foreach ($resources as $r) {
 $purpose = explode('#', $r['arcrole']);
?>
 <tr>
 <td><a href="<?php echo $r['href']; ?>"><?php echo $r['href']; ?></a></td> 
 <td><?php echo $r['title']; ?></td>
 <td><?php echo $purpose[1]; ?></td> 
 <td><a href="<?php echo $r['role']; ?>"><?php echo $r['role']; ?></a></td>
 </tr>
<?php 
 }
?> 
 </table>
<?php 
}
?>
 </body>
</html>
 


图 1. 用 RDDL 数据创建的 Web 页面
用 RDDL 数据创建的 Web 页面




回页首


按照性质或用途挑选资源

上面所用的 getAllResources() 方法返回源文件中所有的资源。但通常要求更复杂一点:比如返回用于 validation 的所有资源或者具有特定性质的资源。XML_RDDL 包也为这些需要提供了相应的方法。清单 5 显示了其中的一部分:


清单 5. 检索资源子集
                        
<html xmlns="http://www.w3.org/1999/xhtml" 
 xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rddl="http://www.rddl.org/" 
 xml:lang="en">
 <head>
 <title>An Example RDDL Document</title>
 </head>
 <body>
 <pre>
<?php
// include class file
include 'XML/RDDL.php';

// create RDDL parser
// parse RDDL file
$rddl = new XML_RDDL();
$rddl->parseRDDL('example.html');

// get resources by nature
// get all DTDs
echo "Resources by nature:\n";
foreach ($rddl->getResourcesByNature('http://www.isi.edu/in-notes/iana/assignments/
 media-types/application/xml-dtd') as $r) { 
 echo $r['href'] . " \n";
}
echo "\n";

// get resources by purpose
// get all software packages
echo "Resources by purpose:\n";
foreach ($rddl->getResourcesByPurpose('http://www.rddl.org/
 purposes#software-package') as $r) { 
 echo $r['href'] . " \n";
}
echo "\n";

// get a specific resource using its id
$dtd = $rddl->getResourceById('dtd');
if (is_array($dtd)) {
 echo "Resource with id 'dtd':\n";
 echo $dtd['href'];
}
?> 
 </pre>
 </body>
</html>
 

分享这篇文章……

digg 将本文提交到 Digg
del.icio.us 发布到 del.icio.us
Slashdot 提交到 Slashdot!

清单 5 示范了三个重要的方法:getResourcesByNature() 根据某种特性 URI 返回全部具有该特性的资源;getResourcesByPurpose() 返回适合特定用途的所有资源;getResourceById() 根据 ID 返回和该标识符匹配的资源。这些方法适合检索符合特定条件的资源。

图 2 显示了 清单 5 的输出结果:


图 2. 清单 5 返回的资源子集
清单 5 返回的资源子集

上述例子表明,XML_RDDL 包提供一个非常有用的 PHP 工具,可以快速访问 XHTML+RDDL 文档中关于资源的特定信息片断。下一次遇到这样的文档时不妨试一试,看看效果如何!



参考资料

学习

获得产品和技术
  • XML_RDDL 包:下载这个可从 XML 文档提取 RDDL 数据的简单易用的接口。

  • XML_Parser 包:下载这个基于 PHP 内置 XML 扩展的 XML 解析器。该 XML 解析类以 PHP 捆绑的 expat 为基础,支持两种基本的操作模式:函数和事件。

  • IBM 试用版软件:用这些试用版软件开发您的下一个项目,可直接从 developerWorks 下载。


讨论


关于作者

Vikram Vaswani 是 Melonfire 的创始人和 CEO,该公司是一家专门研究开源工具和技术的咨询服务公司。他还著有 PHP Programming Solutions How to do Everything with PHP and MySQL 等著作。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款