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

developerWorks 中国  >  XML  >

将 RDDL 用于 XML 和 Web 服务名称空间

不要让名称空间悬在空中

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

Uche Ogbuji (uche.ogbuji@fourthought.com), 首席顾问, Fourthought, Inc.

2004 年 5 月 01 日

长长的名称空间会带来一些问题,比方说,在 WSDL 文件中会造成很大的混乱。资源目录描述语言(RDDL)打包名称空间的信息。如果要对名称空间使用 URL,通过本文所述的 RDDL 可以为 XML 文档或 Web 服务的用户提供有效的指南。

名称空间在 XML 的应用中颇受欢迎,事实上在 Web 服务应用中已经基本普及。名称空间通常采用 URL 的形式,尽管可以采用任何形式的统一资源标识符(Uniform Resource Identifier,URI)。使用 URL 本身并没有坏处,但是如果 URL 什么地方也不指向,就可能造成混乱。用户可能尝试在浏览器中打开对应名称空间的 URL 以获取更多的信息;如果要访问名称空间 URL,最好是保证用户能够看到有用的信息,而不是一个 404 “Not Found”错误。

名称空间 URL 之谜


于是问题归结为在名称空间 URL 的位置放上什么样的文档。过去的一些讨论认为应该使用某种模式。因为名称空间 URL 主要被查找信息的人们访问,XML 社区中的很多人认为可读的文档会更加友好。理想情况下,文档应该附加上机器可读的元数据,以便自动化系统仍然能够使用名称空间 URL 定位技术资料,满足处理该名称空间中 XML 文本的需要,其中也包括模式。

该社区讨论的结果是 资源目录描述语言(Resource Directory Description Language,RDDL),一个打包名称空间信息的标准。RDDL 文档是一种 XHTML文档,包含名称空间的散文体描述。使用 XHTML 使它能够最大限度地与当前的浏览器兼容,并且利用了一种广受欢迎的、知名的丰富文档格式。指向名称空间技术资源的指针用内嵌的 XLink表示。我喜欢把 RDDL 文档称为 资源集注,在定义 RDDL 的社区讨论中我就建议使用这个名称。

本文将说明如何使用 RDDL 在 XML 和 Web 服务格式中支持名称空间。例子采用了 SOAP 中的一般惯例,尽管这些经验也适用于其他 XML 格式。我将坚持使用 RDDL 1.0。一些社区已经开始研究 RDDL 2.0,但是早期的建议存在很大争议,因此我建议在后续版本稳定下来之前应优先考虑 RDDL 1.0。





回页首


SOAP 和 WSDL 的名称空间描述


清单 1 是“SOAP Version 1.2 Part 0: Primer”(请参阅 参考资料)中例 1 的拷贝。

清单 1. 旅行预约 Web 服务的实例 SOAP 文档
<?xml version='1.0' ?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
 <env:Header>
  <m:reservation xmlns:m="http://travelcompany.example.org/reservation" 
          env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
           env:mustUnderstand="true">
   <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference>
   <m:dateAndTime>2001-11-29T13:20:00.000-05:00</m:dateAndTime>
  </m:reservation>
  <n:passenger xmlns:n="http://mycompany.example.com/employees"
          env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
           env:mustUnderstand="true">
   <n:name>?ke Jgvan ?yvind</n:name>
  </n:passenger>
 </env:Header>
 <env:Body>
  <p:itinerary
    xmlns:p="http://travelcompany.example.org/reservation/travel">
   <p:departure>
     <p:departing>New York</p:departing>
     <p:arriving>Los Angeles</p:arriving>
     <p:departureDate>2001-12-14</p:departureDate>
     <p:departureTime>late afternoon</p:departureTime>
     <p:seatPreference>aisle</p:seatPreference>
   </p:departure>
   <p:return>
     <p:departing>Los Angeles</p:departing>
     <p:arriving>New York</p:arriving>
     <p:departureDate>2001-12-20</p:departureDate>
     <p:departureTime>mid-morning</p:departureTime>
     <p:seatPreference/>
   </p:return>
  </p:itinerary>
  <q:lodging
   xmlns:q="http://travelcompany.example.org/reservation/hotels">
   <q:preference>none</q:preference>
  </q:lodging>
 </env:Body>
</env:Envelope>
                

这个示例 SOAP 文档使用了四个名称空间:

  • http://www.w3.org/2003/05/soap-envelope 是标准的 SOAP 名称空间。W3C 实际上和本文的建议不一致,它在这个 URL 上直接放上了 SOAP 的 XML 模式。但是,我认为它有助于说明这种方法的不友好性,因为访问这个 URL 需要能够以可表示的方式处理 W3C XML Schema 的浏览器,而且即便如此,所显示的文档也可能让多数读者摸不着头脑。
  • http://travelcompany.example.org/reservation 是用于一个 SOAP 头的名称空间,标记用于全部预约元数据的信息。为了举例说明,这是一个伪造的 URL。事实上,“example.org”和“example.com”都是标准保留给例子使用的域名,从不用于实际的网络域。
  • http://mycompany.example.com/employees 是用于另一个 SOAP 头的名称空间,标记和客户公司的乘客标识信息有关的信息。
  • http://travelcompany.example.org/reservation/travel 是用于 SOAP 体请求参数的名称空间。




回页首


进入 RDDL


我们主要讨论第一个名称空间。清单 2 是该 Web 服务的示例 RDDL 文档:

清单 2. 用于旅行预约 Web 服务名称空间的示例 RDDL 文档
<!DOCTYPE html PUBLIC
  "-//XML-DEV//DTD XHTML RDDL 1.0//EN"
  "http://www.rddl.org/rddl-xhtml.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:rddl="http://www.rddl.org/">
  <head>
    <title>
Namespace description and resource gloss for travelcompany's
reservation SOAP header
    </title>
    <link href="http://www.rddl.org/xrd.css"
          type="text/css" rel="stylesheet"/>
  </head>
  <body>
    <h1>
Namespace description and resource gloss for travelcompany's
reservation SOAP header
    </h1>
    <div class="head">
      <p>
        <a href="http://travelcompany.example.org/reservation.rddl">
          Latest Version: 17 March 2004
        </a>
      </p>
      <p>Editor:</p>
      <ul>
        <li>
          <a href="mailto:pm%40travelcompany.com">Paul Moore</a>,
          Project Manager
        </li>
      </ul>
    </div>
    <div id="overview">
      <h2>Overview</h2>
      <p>This resource gloss covers the XML namespace
        <code>http://travelcompany.example.org/reservation</code>.
        This is the namespace for reservation SOAP headers in
        travelcompany's Web service.  It covers transaction
        identifiers and time stamps.</p>
      <p>This document is a <a href="http://www.rddl.org/">RDDL</a>
        Resource Gloss.  RDDL is an XHTML document with special
        links (XLinks) that locate various resources related to
        this SOAP Web service.  Technical problems with the RDDL
        glosses hosted at <code>http://travelcompany.example.org/</code>
        should be sent to
        <a href='mailto:webmaster%40travelcompany.org'>the
        administrator</a>.</p>
    </div>
    <h2>Resources relevant to reservation SOAP headers</h2>
    <div id="resources" class="resource">
<rddl:resource
  xlink:title="Reservation SOAP header schema"
  xlink:role="http://www.w3.org/TR/html4/"
  xlink:arcrole="http://www.rddl.org/purposes.htm#normative-reference"
  xlink:href="http://travelcompany.example.org/reservation.xsd"
>
  <h3>Reservation SOAP header schema</h3>
  <p>
    W3C XML schemas for
    <a href="http://travelcompany.example.org/reservation.xsd">
      travelcompany reservation SOAP headers
    </a>
  </p>
</rddl:resource>
<rddl:resource
  xlink:title="travelcompany Web service root namespace"
  xlink:role="http://www.rddl.org/#role"
  xlink:arcrole="http://www.rddl.org/purposes.htm#root-namespace"
  xlink:href="http://travelcompany.example.org/"
>
  <h3>travelcompany Web service root namespace URI</h3>
  <p>
    Root namespace URI <code>http://travelcompany.example.org/</code>
    is the base for all namespaces relative to travelcompany
    Web services.
  </p>
</rddl:resource>
    </div>
    <div id="footer">
      <hr />
      <p>Copyright 2004 travelcompany.</p>
    </div>
  </body>
</html>
                

RDDL 文档类型定义为有效的 XHTML 1.1 模块。可以看出人们很容易阅读这样的文档。其中的文体提供了摘要、编纂、版本和维护的详细信息。 rddl:resource 元素是到该名称空间支持文档的链接,主体部分放在 XHTML 中,即便用户代理不支持 XLink 也仍然能够自然地显示。 xlink:role 给出了链接的 性质,通常表示链接的资源类型(比如模式或样式表)。 xlink:arcrole 属性表示从 RDDL 到该资源的链接的 目的(比如链接的资源是用于验证还是作为标准参考)。XLink 所要求的 xlink:type="simple" 属性在文档中没有表示出来,因为它在 RDDL DTD 中被定义成 #FIXED 属性。

对于放在通用基名称空间上下文中的专用名称空间 URL,指向根名称空间的链接可能非常有用,因为基名称空间可能也有自己的资源集注。

注意, mailto 邮件地址 URL 中的“at”字符( @ )被编码为 %40 。实际上,对于该字符和 RFC 1738 中的多数不常用字符都建议这样做。

整个过程的关键在于为用户提供清晰的、可表示的文档,同时又有机器可读的、到相关资源的链接。注意 清单 2中指定 CSS 的方式:

    <link href="http://www.rddl.org/xrd.css"
          type="text/css" rel="stylesheet"/>
      
                

这是常见的用于呈现 RDDL 的样式表,尽管并不要求必须使用它。这个样式表非常简单,使资源集注差不多在任何浏览器中都能够阅读。





回页首


结束语


将 RDDL 用于名称空间非常简单而且成本低廉,实际上一些用户已经把 RDDL 作为表达通用资源存储库的一种格式。如果您曾经致力于在名称空间的端点上放置,比方说,一个模式,那么您只需要以资源集注的形式增加一个中间层。您可以使用 清单 2中的例子作为起点,将其粘贴到编辑器中,并根据您的名称空间信息作相应的修改。XML 词汇表很少明确规定或建议放在名称空间 URL 上的文档(RDF/XML 是少数的例外之一),但是如果使用这样的词汇表,一定要按照建议去做,即使这样意味着某些情况下不能使用 RDDL。

虽然目前我建议使用 RDDL 1.0,W3C 技术体系结构组(TAG)正努力把 RDDL 发展成更正式的 Web 标准。这是混合行动的一部分,并造成了关于 RDDL 2.0 的开发的混乱。目前提出的建议包括用 RDF 表示 RDDL,以及禁止使用花哨的 XLink(更多依靠标准 XHTML 中的多用途属性)。就像 Tim Bray 在 TAG 邮件列表的一次相关讨论中所说的那样,最终的文档格式“应该用于表示恰好是名称空间的资源。”



参考资料



关于作者

Uche Ogbuji 的照片

Uche Ogbuji 是 Fourthought Inc.的顾问兼创始人,该公司是专为企业知识管理提供 XML 解决方案的软件供应商和咨询公司。 Fourthought 开发了 4Suite,这是一个用于 XML、RDF 和知识管理应用程序的开放源代码平台。Ogbuji 先生也是 VersaRDF 查询语言的首席开发人员。他是一位出生于尼日利亚的计算机工程师和作家,在美国科罗拉多的博耳德生活和工作。可以通过 uche.ogbuji@fourthought.com和 Ogbuji 先生联系。




对本文的评价










回页首


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