跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

技巧: 使用 PHP 解析 RDDL 文档

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

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

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

查看本系列更多内容

发布日期: 2007 年 12 月 24 日
级别: 中级 其他语言版本: 英文
访问情况 : 4361 次浏览
评论: 


简介

如果曾经使用过 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>
 

清单 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 等著作。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Open source
ArticleID=279189
ArticleTitle=技巧: 使用 PHP 解析 RDDL 文档
publish-date=12242007
author1-email=vikram.melonfire@gmail.com
author1-email-cc=dwxed@us.ibm.com

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。