Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1892761
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类: Java

2009-03-06 10:14:29

XML Schema与DTD的比较

我们看例4-3所示的XML文档。

例4-3  employee.xml


张三
26
zhangsan@sunxin.org

如果采用DTD来定义例4-3的XML文档的结构,则一个可能的DTD如例4-4所示。

例4-4  employee.dtd

  ①
     ②
     ③
     ④
  ⑤

这个DTD表示employee元素可以有三个子元素name、age和email,这三个子元素必须依次出现,它们的内容只能是字符数据。employee元素还有一个必需的属性sn,属性值为字符数据。

如果我们想要在上述DTD定义的基础上进一步限制元素的内容,例如,限制age元素的内容只能是正整数,或者限制email元素的内容必须是有效的邮件格式,DTD就无能为力了。下面我们采用XML Schema来定义例4-3的XML文档的结构并约束文档的内容,如例4-5所示。

例4-5  employee.xsd



     ①
          ②
            ③
    ④
  ⑤
        ⑥


value="[a-z0-9A-Z]+([-|\.]?[a-z0-9A-Z])*@([a-z0-9A-Z]+
(-[a-z0-9A-Z]+)?\.)+ [a-zA-Z]{2,}"/>




 ⑧

① 使用XSDL中的xs:element元素来声明employee元素,它的类型为empType,这是自定义的类型,在②处定义。

② 使用XSDL中的xs:complexType元素来定义复杂类型,属性name指定自定义类型的名字,该名字可以被xs:element元素的type属性所引用。

③ XSDL中的xs:sequence元素用于指定在它内部声明的元素必须按照声明的顺序出现。①、②、③合起来与例4-4中的①()对应。

④ 声明name元素,其内容只能是字符串值。与例4-4中的②()对应。

⑤ 声明age元素,其内容只能是正整数。与例4-4中的③()对应。

⑥ 声明email元素,使用正则表达式对email元素的内容做了限定,要求内容必须符合邮件格式的规范。与例4-4中的④()对应。

⑦ XSDL中的xs:pattern元素使用正则表达式来限制值的范围。

⑧ 声明sn属性,属性值是字符串,该属性是必需的(use="required")。与例4-4中的⑤()对应。

从例4-5的XML Schema的定义可以看出,XML Schema具有丰富的数据类型,除了内置的数据类型外(例如:xs:string、xs:positiveInteger),我们还可以定义自己的数据类型(例如:empType)。

如果以建筑图纸与建筑的关系为例来比较XML Schema和DTD,那么DTD只能定义厨房、阳台的位置,主卧的结构等,而XML Schema还可以定义卧室使用什么类型的地板、阳台选用什么类型的铝合窗,即XML Schema定义了丰富的数据类型。

DTD不能很好地满足XML自动化处理的要求(由于采用了非XML语法格式),缺乏对文档结构、元素、属性、数据类型等约束的足够描述。与XML Schema相比,DTD具有以下的局限性:

(1)对数据类型提供了非常有限的支持,且只适用于属性;

(2)约束定义能力不足,无法对XML实例文档做出更细致的语义限制;

(3)DTD定义不够结构化,重用的代价相对较高;

(4)不使用XML语法,无法采用一致的方式来处理XML文档和DTD。

(5)对名称空间仅提供了有限的支持。

例4-5中,xs:pattern元素的value属性的值为:

[a-z0-9A-Z]+([-|\.]?[a-z0-9A-Z])*@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}

这个正则表达式各个组成部分的含义如下:

-  [a-z0-9A-Z]+

a~z范围内的任意一个字母,或者0~9范围内的任意一个数字,或者A~Z范围内的任意一个字母。使用加号(+)表示字母或数字可以出现1到多次。例如:a、7、d10、abc99、a99b

-  ([-|\.]?[a-z0-9A-Z])*

其中 [-|\.]? 表示允许出现0或者1个 "-"或者"."。[a-z0-9A-Z]匹配多位数字或字母。使用星号(*)表示以上组合可以重复出现0到多次。例如:-a、-a99、.a0b。

-  @

匹配@号。

-  ([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+

其中[a-z0-9A-Z]+同第一项。-[a-z0-9A-Z]+ 表示"-"可以和任意的字母或数字组合。(-[a-z0-9A-Z]+)? 表示该组合可以出现0次或1次,\. 匹配"." 。上述完整表达式匹配任意字母或数字组成的字符序列,中间可以出现"-",最后必须是"."。例如:0c-0.、sina.com.、sg-mail.。

-  [a-zA-Z]{2,}

匹配至少两个字母,大小写都可以。现在有mobi和name域名,要限制最后的字母个数,可以写为:[a-zA-Z]{2,4}

阅读(671) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~