XML 和 WebSphere Studio Application Developer — 第 6 部分: 使用 XML Schema 和 XML Editor 揭开 XML 名称空间神秘的面纱

引言
IBM® WebSphere® Studio Application Developer是一种应用程序开发产品,它支持用 JSP、servlet、HTML、XML、Web 服务、数据库和 EJB 等不同技术来构建多种应用程序。Application Developer 还特别提供了 XML 和关系数据之间的紧密集成。凡是 WebSphere Application Server 支持的数据库,Application Developer 都支持,包括 DB2®、Oracle、Sybase 和 Microsoft® SQL Server™ 在内。

本文是一系列重点讲述 WebSphere Studio Application Developer 附带提供的多种 XML 工具的文章的第 6 部分。 第 1 部分展示了如何使用 Application Developer 开发 XML Schema; 第 2 部分演示了如何使用 Application Developer 的 SQL Builder 创建 SQL 查询; 第 3 部分讨论了 Application Developer 中可以用来在应用程序中集成数据访问和 XML 的功能; 第 4 部分讲述的是 XML Editor,一个用来创建和编辑 XML 文档的可视化工具; 第 5 部分讨论的则是如何使用 RDB to XML Mapping Editor 来创建 DB2 XML Extender 所用的 DAD 文件。

第 6 部分演示如何同时使用 XML Schema Editor 和 XML Editor 来开发使用 XML 名称空间的 XML 应用程序。

为什么我们需要 XML 名称空间
既然每个人都能够创建自己在问题域中使用的 XML 元素和属性,那我们就需要有一种办法,能够把具有相同名称但来自于不同问题域的元素区别开来。举例来说,PurchaseOrder(采购订单)可能来自两家不同的公司;在这种情况下,我们就可以使用 XML 名称空间机制将两者区别开来。

XML 名称空间(XML Namespace)规范发布于 1999 年年初,远远早于 XML Schema 规范。那时,因为没有一种用 DTD 构造名称空间的标准方法,所以我们无法使用 DTD 来验证对名称空间敏感的 XML 文档。在 2001 年 5 月引入了 XML Schema 之后这种情形得到了改变,因为 XML Schema 支持名称空间。诸如 Xerces2之类的验证分析器(validating parser)可以按照 XML Schema 文档的规定来验证使用名称空间的实例文档。

通过示例解释 XML 名称空间
要解释所有的名称空间概念,最好的办法是通过示例来说明。我们将通过一系列示例来仔细讨论以下名称空间主题。

您可以使用 XML Schema Editor 来创建或导入如下所示的 Course.xsd 模式文件。这个模式的目标名称空间是 http://www.utoronto.ca 。这意味着在这个模式中定义的所有类型都属于目标名称空间 http://www.utoronto.ca ,而且您可以通过使用这个模式中的前缀 course 来引用这些类型。

清单 1. Course.xsd 文件

<schema xmlns="http://www.w3.org/2001/XMLSchema" 

   targetNamespace="http://www.utoronto.ca" 

   xmlns:course="http://www.utoronto.ca">

   <element name="Schedule">

      <complexType>

         <sequence>

            <element name="course" type="course:CourseInfo"/>

            <element name="location" type="string"/>

         </sequence>

      </complexType>

   </element>

   <complexType name="CourseInfo">

      <sequence>

         <element name="courseId" type="string"/>

         <element name="description" type="string"/>

      </sequence>

   </complexType>

</schema>

无限定的本地元素
要创建一个与 Course.xsd 模式文件一致的实例文档,请选择 Course.xsd 文件,然后选择 Generate =>XML File来启动 Create XML File 向导。单击 Next。在 Select Root Element 页中,请选中 Create required and optional content选项,以创建一个带有所需元素的 XML 文档,如下面的图 1 所示。请注意,在创建实例文档时自动使用了目标名称空间和 XML 模式文件的前缀。单击 Finish 后就会自动创建 Course.xml 文件(请参看下面的清单 2)。

图 1. 从 Course.xsd 生成 XML 文档
Create XML File 的抓屏 — Select Root Element 向导

清单 2. Course.xml 文件 — 无限定的本地元素

<course:Schedule xmlns:course="http://www.utoronto.ca" 

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

   xsi:schemaLocation="http://www.utoronto.ca Course.xsd ">   

   <course>

      <courseId>courseId</courseId>

      <description>description</description>

   </course>

   <location>location</location>

</course:Schedule>

让我们再来看看 Course.xml 文件。首先,根元素 Schedule 被限定(即 course:Schedule )为属于名称空间 http://www.utoronto.ca 。这就使得我们可以把多伦多大学(University of Toronto)提供的课程(course)和其它大学提供的课程区别开来。其次,所有本地元素都是 无限定的。也就是说,诸如 coursecourseIddescriptionlocation 之类的本地元素都没有前缀。这是因为 Course.xsd 模式文件指定了本地元素不应被限定。您或许在想,对于编写实例的人来说,要确定什么需要限定以及什么不需要限定可能会让人很头痛。下一部分就将告诉您,在一个实例文档中如何使每个元素都是限定的。

限定的本地元素
要使 XML 实例文档中的所有本地元素都得到限定,XML Schema 编写者就必须在 schema 元素中把 elementFormDefault 属性设置为 qualified 。要完成这项工作,您只要将 Course.xsd 模式对象的 Design 视图的 Element form default 字段选为 qualified就可以了,如下面的图 2 所示。

图 2. 指定所有本地元素都要得到限定
Course.xsd Design 视图的抓屏

这样, elementFormDefault 属性就被添加到了 schema 标记中,并被设置为 qualified

<schema xmlns="http://www.w3.org/2001/XMLSchema" 

   targetNamespace="http://www.utoronto.ca" 

   xmlns:course="http://www.utoronto.ca" elementFormDefault="qualified">

现在,请保存 Course.xsd 文件并再次调用 Create XML File 向导。这样就将生成如下面的清单 3 所示的 Course.xml 文件。请注意,所有元素(全局的和本地的)都用前缀 course 加以限定。

清单 3. Course.xml 文件 — 限定的本地元素

<course:Schedule xmlns:course="http://www.utoronto.ca" 

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

   xsi:schemaLocation="http://www.utoronto.ca Course.xsd ">    

   <course:course>

      <course:courseId>courseId</course:courseId>

      <course:description>description</course:description>

   </course:course>

   <course:location>location</course:location>

</course:Schedule>

没有目标名称空间的 Schema
您可以使用 XML Schema Editor 来创建或导入如下所示的 Course1.xsd 模式文件。正如模式标记中未出现 targetNamespace 属性所表明的那样,这个 Course1.xsd 并不属于某个名称空间。

清单 4. Course1.xsd 文件 — 这个模式并不属于某个名称空间

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

   <xsd:element name="Schedule">

      <xsd:complexType>

         <xsd:sequence>

            <xsd:element name="course" type="CourseInfo"/>

            <xsd:element name="location" type="xsd:string"/>

         </xsd:sequence>

      </xsd:complexType>

   </xsd:element>



   <xsd:complexType name="CourseInfo">

      <xsd:sequence>

         <xsd:element name="courseId" type="xsd:string"/>

         <xsd:element name="description" type="xsd:string"/>

      </xsd:sequence>

   </xsd:complexType>    

</xsd:schema>

请注意这个模式的类型定义是如何不用前缀而进行调用的。举例来说, CourseInfo 复杂类型(complex type)就是在元素 course 中不用前缀以 CourseInfo 的形式进行调用。要把 XML Schema 元素(如 complexType、string 等)和用户在不属于某个名称空间的模式中定义的元素区别开来,我们可以按照 W3C 推荐(W3C recommendation)使用一个前缀(例如本示例中的 xsd )来显式地限定 XML Schema 元素。

要生成实例文档,请在 Course1.xsd 上调用 Generate XML File 向导。请注意名称空间和一些前缀字段的空缺情况。单击 Finish 就会生成如清单 5 所示的 Course1.xml 文件。

清单 5. Course1.xml 文件 — 用 xsi:noNamespaceSchemaLocation 来提供模式位置

<Schedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

   xsi:noNamespaceSchemaLocation="Course1.xsd">     

   <course>

      <courseId>courseId</courseId>

      <description>description</description>

   </course>

   <location>location</location>

</Schedule>

让我们再来看看 Course1.xml 文件。首先,请注意添加到根元素中的 xsi:noNamespaceSchemaLocation 属性(而不是 xsi:schemaLocation 属性)。这个属性用来提供关于没有名称空间的模式文档的位置的线索。这样,您仍然可以对照相应的模式来验证该实例文档。再者,请注意到所有元素(全局的和本地的)都没有加以限定。实际上,这个文档看起来更像一个不使用名称空间的传统的 XML 文档。

总之,如果您想让实例文档不需使用前缀,但却能够按照 XML Schema 而非 DTD 进行验证,那么这种模式是很有用的。然而,如果您想发布您的模式以供其它模式重用,那么,由于这种模式可能会因另一词汇而导致名称冲突,它就会令人很头痛。

目标名称空间为缺省名称空间的 Schema
您可以使用 XML Schema Editor 来创建或导入如下所示的 Course2.xsd 模式文件。

清单 6. Course2.xsd 文件 — 目标名称空间与缺省名称空间相同

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

   targetNamespace="http://www.utoronto.ca" 

   xmlns="http://www.utoronto.ca">

   <xsd:element name="Schedule">

      <xsd:complexType>

         <xsd:sequence>

            <xsd:element name="course" type="CourseInfo"></xsd:element>

            <xsd:element name="location" type="xsd:string"></xsd:element>

         </xsd:sequence>

      </xsd:complexType>

  </xsd:element>



  <xsd:complexType name="CourseInfo">

     <xsd:sequence>

        <xsd:element name="courseId" type="xsd:string"></xsd:element>

        <xsd:element name="description" type="xsd:string"></xsd:element>

     </xsd:sequence>

  </xsd:complexType>

</xsd:schema>

正如 targetNamespace 属性所表明,这个模式的目标名称空间是 http://www.utoronto.ca 。通过在该模式对象的 Prefix 字段中不指定前缀,我们使得这个模式的缺省名称空间与目标名称空间相同。

图 3. 目标名称空间没有前缀
显示让模式对象的 Prefix 字段为空白的抓屏

单击 Apply 按钮后,您将能注意到 xmlns 属性被添加到了模式标记中,用来指定这个模式的缺省名称空间是 http://www.utoronto.ca 。您还将能注意到 XML Schema 构造被自动用前缀 xsd (这一前缀可以从 XML Schema Preference 页进行修改)加以限定,以将这些 XML Schema 构造与缺省名称空间中的类型(如 Schedule )区别开来。

通过让这个模式的目标名称空间成为缺省名称空间,我们在对这个模式的类型进行引用时就不必对它们加以限定了(例如,不需要对 CourseInfo 加以限定)。请比较 Course2.xsdCourse.xsd ,确保您看到了其间的差别。

要生成这个实例文档,请在 Course2.xsd 文件上调用 Generate XML File 向导。请注意前缀字段的空缺情况以及出现一条表明丢失了一个前缀的出错消息的情况。请单击 Edit 按钮以启动 New Namespace Information 对话框(请参看下面的图 4)。请输入一个前缀,例如 course 。单击 Finish 将生成 Course2.xml 文件,并且这个文件应该与清单 2 中的 Course.xml 文件相似。

图 4. 指定实例文档的前缀
New Namespace Information 对话框的抓屏

多个模式和多个名称空间
随着模式变得越来越庞大,人们常常希望把一个模式分成若干个较小的模式,从而更易于维护和重用。借用诸如 W3C 之类的标准组织所开发的模式也是很普遍的事情。在这个部分中,我们将来看看在 XML Schema Editor 中创建模式时,如何使用来自多个模式的构造。我们还将分析本实例文档中多个名称空间的含义。

在开始之前,您要确保已经下载了 下面所提供的 namespace.zip 文件,并将 Calendar/Course.xsdCalendar/Job.xsd 解压缩到您当前的工程中。

第 1 步. 创建 Calendar.xsd 文件
使用 Create XML Schema 向导在您当前的工程中创建 Calendar.xsd 模式文件。现在,您对这一步应该是驾轻就熟了。

第 2 步. 导入 Course.xsd 和 Job.xsd 模式文件
在 Outline 视图中,单击 Calendar文件对象并从弹出菜单中选择 Add Import。这将在 outline 视图中创建一个新的 import 元素对象。

单击 import 对象。在 Schedule.xsd 模式对象的 Design 视图中,使用 Select按钮来调用 Select XML Schema file 向导。选择 Select schema from Workbench projects选项。单击 Next 并选择 Course.xsd 模式文件。这将从 Course.xsd 文件导入一些定义,以便我们今后使用它们。此外,它还将检索 Course.xsd 的名称空间和名称空间前缀。结果如下面的图 5 所示。

图 5. 导入 Course.xsd 模式
Schedule.xsd 模式对象的 Design 视图的抓屏

切换到 Source 视图查看源代码。您将会注意到,除了 Course.xsdimport 元素之外, schema 元素中还自动生成了 xmlns:course 属性。

<schema xmlns="http://www.w3.org/2001/XMLSchema" 

   targetNamespace="http://www.ibm.com" 

   xmlns:Calendar="http://www.ibm.com" 

   xmlns:course="http://www.utoronto.ca">

现在,请重复上述步骤,为 Job.xsd 文件添加 import 元素。

第 3 步. 添加一个约会(appointment)
我们将在 Calendar 模式中创建一个约会。这个约会将包含课程(course)和工作(job)的列表,这些课程和工作将构成我们的日常事务。

  1. 在 Outline 视图中,添加一个全局元素 appointment ,并将它的类型指定为匿名复杂类型(anonymous complex type)。
  2. 单击匿名类型(anonymous type),然后选择 Add Content Model。在 Design View 中将内容模型(content model)从 sequence改为 choice。此外,把最小值(Minimum)字段设为 0,把最大值(Maximum)字段设为 unbounded
  3. 选择 choice元素,并选择 Add Element Ref添加一个元素引用。在 Reference name 字段中,请注意 course:Schedule 作为一个选择可用的情况。这是因为我们在第 2 步中导入了来自 Course.xsd 文件的一些定义。请选择 course:Schedule作为我们想引用的元素。
  4. 请再次选择 choice元素,然后选择 Add Element Ref添加一个元素引用。在 Reference name 字段中,请注意 Job:JobInfo 作为一个选择可用的情况。这是因为我们在第 2 步中导入了来自 Job.xsd 文件的一些定义。请选择 Job:JobInfo作为我们想引用的元素。
  5. 请给这个复杂类型添加两个属性, startTimeendTime

完成后的 Calendar.xsd 模式如下面的图 6 所示。

图 6. 导入了 Course.xsd 和 Job.xsd 的 Calendar.xsd
显示完成后的 Calendar.xsd 的抓屏

第 4 步. 生成 Calendar.xml 文件
为了生成与 Calendar.xsd 一致的实例文档,请再一次在 Calendar.xsd 上调用 Generate XML File 向导。这个实例文档将使用来自三个不同名称空间的三个模式。请注意在 Select Root Element 页中自动为您进行检测的情况。单击 Finish 就将为您生成一个有效的 Calendar.xml 文件。

图 7. 生成带有多个名称空间的 Calendar.xml
Create XML File 的抓屏 — Select Root Element 向导

第 5 步. 使用 XML Editor 编辑 Calendar.xml 文件
在 XML Editor 中打开 Calendar.xml 文件。在 Design 视图中,您很快就可以看到根元素 Calendar:appointment 下的名称空间属性值(例如, xmlns:Calendarxmlns:Jobxmlns:course )。为了能够进行验证, xsi:schemaLocation 属性必须包含指向相应模式的线索,如下面的图 8 所示。

图 8. 在 XML Editor 中编辑 Calendar.xml
显示正在 XML Editor 中编辑 Calendar.xml 的抓屏

在本系列的 第 4 部分中,我们讨论了在 XML Editor 中如何使用 XML Schema 或 DTD 提供受指导编辑。这样的受指导编辑对名称空间也是起作用的。例如,当您打开 Calendar:appointment 元素上的弹出菜单时,将注意到 Add Child会让您选择将 course:ScheduleJob:JobInfo 添加到 appointment 元素中。这种情况如下面图 9 所示。

图 9. 添加 <course:Schedule> 或 <Job:JobInfo> 元素
显示如何添加元素的抓屏

结束语
本文概略讲述了常用的 XML 名称空间模式,并向您演示了如何用 WebSphere Studio Application Developer 的一些 XML 工具来设计 XML Schema 和 XML 实例文档。正如文中所述,XML Schema 编写者为模式文档选择的名称空间和限定对实例文档的结构有诸多影响。这些 XML 工具所具有的生成能力使得您可以快速修改 XML Schema 并生成实例文档,从而确保您设计的模式是正确的。

下载
Name Size Download method
0206_namespace.zip 8 KB HTTP
*关于下载方法的信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值