岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Java >> XML >> WebServices >> Java正文
W3C XML Schema 与文档类型定义
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-23 0:05:20
lt;/xsd:restriction>
</xsd:simpleType>


何时使用DTD

    遇到以下情况时,DTD 仍然是您的首选:

    文档规则的简洁表示很重要。

    希望下游用户能够通过内部参数集覆盖并将类型专门化。

    您的文档规则主要考虑元素的嵌套而不是内容的语义约束(如同使用散文标记)。

    惯常使用的工具支持 DTD 胜于支持模式。

    从表面上看,这些元素定义中有两个显著特性。首先是模式本身是格式完整的 XML 实例,其标记使用 xsd 名称空间(实际上,DTD也是这样,但它只有处理指令,而没有这样的内容);其次(根据第一点的结论)是模式远比DTD 繁琐。

    除了语义方面的准确性以外,还可以看到模式示例能够执行一些DTD 不可能完成的操作。 prodName 类型在定义之间基本上是相同的,但模式中的 USPrice 和 shipDate 规范分别是 decimal 和 date 类型。 作为文本文件,具有这些元素的 XML实例在元素内部包含一些 ASCII(或Unicode)字符;不过,具有模式意识的确认器可以在 decimal 和 date 元素内部要求更具体的字符格式(其它类型也是一样)。 更有趣的是属性 partNum ,它属于派生的专门类型。类型 SKU 不是内置类型,而是跟在 "SKU"声明中给定模式后的一系列字符(具体来说,它必须有三位:一个连线和两个大写字母,按这样的顺序)。也有可能将 SKU 用于元素类型;它在这种情况下定义属性只是一种巧合。

    在元素定义的 DTD版本中,所有这些有趣的(如果是专门的,也可能相当复杂)类型一定简单地称之为 PCDATA ,至于字符数据是什么样没有更多说明(在属性情况中是 CDATA )。

    在类型丰富的元素/属性值中,模式巧妙地从描述 XML实例的语法渐变到描述其语义。语法分析纯化论者可能会就我的描述提出异议:“内置模式类型是从语法上定义的,因此构建在这些内置类型上的模式在形式上也是符合语法的。”但在实际情况中,当声明一个给定的元素必须是 date 时,您实际上希望的是让元素包含一个日期。当然,表达语义信息不是件坏事,但有人会争论说最好同样将它限制在应用程序级别,而不是格式声明。毕竟有一些语义特性 —— 即使是简单的特性 ——避开了模式,但在应用程序中和模式所表达的内容一样重要。 例如,当然"stock-keeping unit" 必须类似于"999-AA";但可能您还提供在十三以内的小装置。 integer 被13 整除性不能使用 XML 模式表达(因此您仍然无法在这一级别上为 widgetquantity提供所需的约束)。这里的重点是说,即使有模式(胜过DTD)的额外能力,仍可能需要在应用程序级别上执行后确认来确定 XML文档是否 在功能上有效。

 

[1] [2] 下一页  

出现约束


    除了强大的类型声明以外,XML 模式还在 DTD声明子元素模式的基数性能力的基础上进行了改进。不过,DTD用于表达每个出现约束(基数性)的方法比 XML模式总是笨拙许多。 

     在 DTD中,符号: ? 、 * 和 + 分别指定“零或一”、“零或多个”、“一个或多个”,其中一个量化了基数性。即,除了问号有能力说:“有或没有”以外,DTD语法中似乎没有可以限制给定模式出现次数的东西(无论是单一子标记还是嵌套的一系列)。因此如何表达上面模式示例中 1-5 个 prodName 的出现似乎是个问题。同样地,如果没有 XML 模式属性 minOccurs ,我们似乎就无法表达让某个事物出现特定次数的需求(而非“至少一次”)。实际上,DTD的最小量词虽然有时不是很讲究,但已经够好的了。下面是等价的约束: 

清单 3:“七到十二”个甜面圈的 XML模式语法 


<xsd:element name="donutorder">
 <xsd:complexType>
 <xsd:sequence>
 <xsd:element name="donut" type="xsd:string"
 minOccurs="7" maxOccurs="12" />
 </xsd:sequence>
 </xsd:complexType>
</xsd:element>


<!ELEMENT donut (#PCDATA)>
<!ELEMENT donutorder
 (donut,donut,donut,donut,donut,donut,donut,
 donut?,donut?,donut?,donut?,donut?)


当然,如果获得大笔订单,DTD看上去开始 真的很糟糕! 


枚举


无论是 DTD 还是 W3C XML Schema都允许在属性中使用枚举类型,但模式是非常了不起的进步,因为它们还可以在元素内容中允许使用枚举类型。我认为,DTD真正的缺点在于它缺乏这种能力。而且,模式的枚举方法非常全面而优秀。一个专门的 simpleType 可以包含一个枚举 面。这样的 simpleType 自动适合于属性或元素值类型。 

让我们举例说明每种语法:

清单 4:用于枚举属性的 XML模式语法 


<xsd:simpleType name="shoe_color">
 <xsd:restriction base="xsd:string">
 <xsd:enumeration value="red"/>
 <xsd:enumeration value="green"/>
 <xsd:enumeration value="blue"/>
 <xsd:enumeration value="yellow"/>
 </xsd:restriction>
</xsd:simpleType>
<xsd:element name="pers

上一页  [1] [2] [3] 下一页


  • 上一个Java:
  • 下一个Java:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    传世私服 传奇世界私服 天龙八部私服 bet365 传世私服 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365