您的位置:首页 > 移动开发

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

2005-10-27 10:01 761 查看
引言
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 名称空间
要解释所有的名称空间概念,最好的办法是通过示例来说明。我们将通过一系列示例来仔细讨论以下名称空间主题。
无限定的本地元素限定的本地元素
没有目标名称空间的 Schema
目标名称空间为缺省名称空间的 Schema
多个模式和多个名称空间
您可以使用 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[/b]来启动 Create XML File 向导。单击 Next[/b]。在 Select Root Element 页中,请选中 Create required and optional content[/b]选项,以创建一个带有所需元素的 XML 文档,如下面的图 1 所示。请注意,在创建实例文档时自动使用了目标名称空间和 XML 模式文件的前缀。单击 Finish[/b] 后就会自动创建
Course.xml
文件(请参看下面的清单 2)。
图 1. 从 Course.xsd 生成 XML 文档



清单 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)和其它大学提供的课程区别开来。其次,所有本地元素都是 无限定的[/i]。也就是说,诸如
course
courseId
description
location
之类的本地元素都没有前缀。这是因为
Course.xsd
模式文件指定了本地元素不应被限定。您或许在想,对于编写实例的人来说,要确定什么需要限定以及什么不需要限定可能会让人很头痛。下一部分就将告诉您,在一个实例文档中如何使每个元素都是限定的。
限定的本地元素
要使 XML 实例文档中的所有本地元素都得到限定,XML Schema 编写者就必须在
schema
元素中把
elementFormDefault
属性设置为
qualified
。要完成这项工作,您只要将
Course.xsd
模式对象的 Design 视图的 Element form default 字段选为 qualified[/b]就可以了,如下面的图 2 所示。
图 2. 指定所有本地元素都要得到限定



这样,
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[/b] 就会生成如清单 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. 目标名称空间没有前缀



单击 Apply[/b] 按钮后,您将能注意到
xmlns
属性被添加到了模式标记中,用来指定这个模式的缺省名称空间是
http://www.utoronto.ca
。您还将能注意到 XML Schema 构造被自动用前缀
xsd
(这一前缀可以从 XML Schema Preference 页进行修改)加以限定,以将这些 XML Schema 构造与缺省名称空间中的类型(如
Schedule
)区别开来。
通过让这个模式的目标名称空间成为缺省名称空间,我们在对这个模式的类型进行引用时就不必对它们加以限定了(例如,不需要对
CourseInfo
加以限定)。请比较
Course2.xsd
Course.xsd
,确保您看到了其间的差别。
要生成这个实例文档,请在
Course2.xsd
文件上调用 Generate XML File 向导。请注意前缀字段的空缺情况以及出现一条表明丢失了一个前缀的出错消息的情况。请单击 Edit[/b] 按钮以启动 New Namespace Information 对话框(请参看下面的图 4)。请输入一个前缀,例如
course
。单击 Finish[/b] 将生成
Course2.xml
文件,并且这个文件应该与清单 2 中的
Course.xml
文件相似。
图 4. 指定实例文档的前缀



多个模式和多个名称空间
随着模式变得越来越庞大,人们常常希望把一个模式分成若干个较小的模式,从而更易于维护和重用。借用诸如 W3C 之类的标准组织所开发的模式也是很普遍的事情。在这个部分中,我们将来看看在 XML Schema Editor 中创建模式时,如何使用来自多个模式的构造。我们还将分析本实例文档中多个名称空间的含义。
在开始之前,您要确保已经下载了 下面所提供的
namespace.zip
文件,并将
Calendar/Course.xsd
Calendar/Job.xsd
解压缩到您当前的工程中。
第 1 步. 创建 Calendar.xsd 文件
使用 Create XML Schema 向导在您当前的工程中创建
Calendar.xsd
模式文件。现在,您对这一步应该是驾轻就熟了。
第 2 步. 导入 Course.xsd 和 Job.xsd 模式文件
在 Outline 视图中,单击 Calendar[/b]文件对象并从弹出菜单中选择 Add Import[/b]。这将在 outline 视图中创建一个新的
import
元素对象。
单击 import[/b] 对象。在
Schedule.xsd
模式对象的 Design 视图中,使用 Select[/b]按钮来调用 Select XML Schema file 向导。选择 Select schema from Workbench projects[/b]选项。单击 Next[/b] 并选择
Course.xsd
模式文件。这将从
Course.xsd
文件导入一些定义,以便我们今后使用它们。此外,它还将检索
Course.xsd
的名称空间和名称空间前缀。结果如下面的图 5 所示。
图 5. 导入 Course.xsd 模式



切换到 Source 视图查看源代码。您将会注意到,除了
Course.xsd
import
元素之外,
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)的列表,这些课程和工作将构成我们的日常事务。
在 Outline 视图中,添加一个全局元素
appointment
,并将它的类型指定为匿名复杂类型(anonymous complex type)。
单击匿名类型(anonymous type),然后选择 Add Content Model。在 Design View 中将内容模型(content model)从 sequence改为 choice。此外,把最小值(Minimum)字段设为 0,把最大值(Maximum)字段设为 unbounded
选择 choice元素,并选择 Add Element Ref添加一个元素引用。在 Reference name 字段中,请注意 course:Schedule 作为一个选择可用的情况。这是因为我们在第 2 步中导入了来自
Course.xsd
文件的一些定义。请选择 course:Schedule作为我们想引用的元素。
请再次选择 choice元素,然后选择 Add Element Ref添加一个元素引用。在 Reference name 字段中,请注意 Job:JobInfo 作为一个选择可用的情况。这是因为我们在第 2 步中导入了来自
Job.xsd
文件的一些定义。请选择 Job:JobInfo作为我们想引用的元素。
请给这个复杂类型添加两个属性, startTimeendTime
完成后的
Calendar.xsd
模式如下面的图 6 所示。
图 6. 导入了 Course.xsd 和 Job.xsd 的 Calendar.xsd



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



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



在本系列的 第 4 部分中,我们讨论了在 XML Editor 中如何使用 XML Schema 或 DTD 提供受指导编辑。这样的受指导编辑对名称空间也是起作用的。例如,当您打开
Calendar:appointment
元素上的弹出菜单时,将注意到 Add Child[/b]会让您选择将 course:Schedule[/b]或 Job:JobInfo[/b] 添加到
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














关于下载方法的信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐