级别: 初级 Brett McLaughlin (brett@newInstance.com), Enhydra 策略顾问
2001 年 8 月 01 日 请开始使用 XML 模式来约束 XML 文档。这篇简短的技巧说明会告诉您如何从 XML 文档中引用 XML 模式。五段样本代码将显示如何实现。
随着 W3C 最近确定了 XML 模式规范,您可能应开始使用模式了。与使用 DTD(文档类型定义)定义约束相比,模式可以给您更好的灵活性和确定性。本技巧说明演示了使用模式的一个重要部分:如何在文档中引用它们。即使其他人正在编写模式,您可能需要知道如何在 XML 文档中引用它们。
早期的 DTD
首先,让我简要地比较一下以供参考。在 XML 模式之前,每个人都使用 DTD 来进行约束,而且很多人现在仍这么做。要使用 DTD 进行约束,应在 XML 文档中使用
DOCTYPE 声明来引用 DTD,如“清单 1”所示:
清单 1. 引用 DTD
<?xml version="1.0"?>
<DOCTYPE hockeyTeam SYSTEM "dtd/hockeyTeam.dtd">
<hockeyTeam>
<team name="Dallas Stars">
<!-- More XML Content -->
</team>
</hockeyTeam>
|
在“清单 1”的文档中,所引用的 DTD 名叫
hockeyTeam.xml ,它在目录
dtd 中。可以在 XML 文档的
DOCTYPE 标记中指定约束,以代替在独立的 DTD 文档中指定约束。对于这个示例,我使用了一个拥有 XML 约束的独立 DTD 文档,因为这是一个更好的设计,而且因为它与需要使用 XML 模式的方法类似。
名称……空间中有什么?
除了理解 XML 的基础,您还需要掌握 XML 名称空间规范的一些知识(请参阅
参考资料)。该规范的优点超出了本篇技巧说明的范围,但您需要知道的是名称空间基本上是将一个前缀(如
nhl )绑定到某个特定 URI(如 http://www.nhl.com)。可以将前缀添加到元素名称的开头(例如,
nhl:hockeyTeam ),以便将该元素放到相关 URL 标识的名称空间中。如果指定了 URL,但是
没有指定前缀,那么该名称空间会成为
缺省名称空间;没有前缀的元素将落入缺省名称空间。“将缺省名称空间看作是带有空的前缀的名称空间”可能会对理解它有所帮助。名称空间声明的使用及其前缀让您可以在一个模式使用多个名称空间中的元素定义。
一个 XML 模式可以对一个名称空间设置约束。因此,如果在一个 XML 文档中有 4 个名称空间,而且您要约束所有名称空间中的所有元素,通常需要 4 个 XML 模式。对于每个名称空间,都需要指定约束该名称空间的模式。再次声明,名称空间在内容和功能之间提供了一种很好的分离方法。
切入正题
好,基础知识已经介绍得足够多了;现在切入正题。
首先需要在文档中声明“XML 模式实例”名称空间,以授予您对引用 XML 模式时需要的属性的访问权。当然,要添加前缀映射(
xsi )和相关 URI,如“清单 2”中所示。我还添加了一个缺省名称空间 http://www.nhl.com,以便为文档中的所有无前缀元素提供驻留地(在本示例中,所有元素都是无前缀元素)。
清单 2. 定义“XML 模式实例”名称空间
<?xml version="1.0"?>
<hockeyTeam xmlns="http://www.nhl.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<team name="Dallas Stars">
<!-- More XML Content -->
</team>
</hockeyTeam>
|
一旦“XML 模式实例”名称空间可用,就可以使用其内部的
schemaLocation 属性了。该属性的值其实是
两个值。第一值,或自变量,是要约束的名称空间。在本示例中,这个值是
http://www.nhl.com ,即缺省名称空间。第二个值,或自变量,是用于名称空间约束的 XML 模式的位置。要查看这个值,请参考“清单 3”:
清单 3. 引用 XML 模式
<?xml version="1.0"?>
<hockeyTeam xmlns="http://www.nhl.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nhl.com schemas/hockeyTeam.xsd">
<team name="Dallas Stars">
<!-- More XML Content -->
</team>
</hockeyTeam>
|
请注意名称空间 URI 和模式之间的空格。
插入该空格需小心;省去这个空格会给您带来各种麻烦!此外,请注意,模式位置可以就是一个 URI,如“清单 4”所示:
清单 4. 使用 URI 作为模式位置
<?xml version="1.0"?>
<hockeyTeam xmlns="http://www.nhl.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nhl.com
http://www.nhl.com/hockeyTeam.xsd">
<team name="Dallas Stars">
<!-- More XML Content -->
</team>
</hockeyTeam>
|
好了。添加新的名称空间和模式很简单,只涉及到将
第二(或第三或第四)对值添加到
schemaLocation 属性。清单 5 将一个新的名称空间添加到 XML 文档中,并且添加了另一个与其相关的模式。
清单 5. 引用多个模式
<?xml version="1.0"?>
<hockeyTeam xmlns="http://www.nhl.com"
xmlns:stars="http://www.dallasstars.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nhl.com
http://www.nhl.com/hockeyTeam.xsd
http://www.dallasstars.com http://www.dallasstars.com/stars.xsd"">
<team name="Dallas Stars" stars:logo="http://www.dallasstars.com/logo.jpg">
<!-- More XML Content -->
</team>
</hockeyTeam>
|
如果您正在使用模式或者打算使用它们,那么您一定要掌握 XML 模式规范(从第 0 部分开始),因为在引用模式、使用模式(无论带不带名称空间)和设计文档约束时有许多选项。无论您使用这些特性的哪种组合,请明智地约束 XML,玩得开心点!
参考资料
关于作者  | 
|  | Brett McLaughlin(
brett@newInstance.com)是 Lutris Technologies 的 Enhydra 策略顾问,专长于分布式系统体系结构方面。他是
Java and XML(O'Reilly)的作者。他参与了如 Java Servlet、Enterprise JavaBean、XML 和商家对商家应用程序等技术的研究。他与 Jason Hunter 一起发起了 JDOM 项目,该项目为从 Java 应用程序中操纵 XML 提供了一个简单的 API。他还是 Apache Cocoon 项目和 EJBoss EJB 服务器的活跃开发人员以及 Apache Turbine 项目的共同创始人之一。
|
对本文的评价
|