扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月22日
关键字:
在本页阅读全文(共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="person" type="person_type">
<xsd:attribute name="shoes" type="shoe_color"/>
</xsd:element>
<!ATTLIST person shoes (red | green | blue | yellow)>
DTD属性声明看来还算不错(可能在简明性方面更好),但如果您的模型在元素内容中放入 shoe_color ,DTD 就变得很直截了当:
清单 5:用于枚举元素的 XML模式语法
<xsd:element name="shoes" type="shoe_color">
W3C XML Schema 可以让 XML程序员表达一组新的对文档的声明性约束,而这是 DTD做得不够的地方。对许多程序员来说,在模式中使用 XML 实例语法还会对XML任务的不同部分产生更大的不一致性(当然,其他人不同意这种说法)。模式的目标当然是随着它们为人们逐步了解,以及开发者增强更多用于它们的工具,而在重要性和作用域方面得到增长。
一种在模式工作开始时得到飞跃的方法是将从现有 DTD 到 XML模式格式的转换自动化。很明显,自动转换无法对 XML模式本身添加新的表达能力;但自动化可以创建好的模板,从中指定人们希望施加的特定类型约束。 参考资料部分提供了到自动 DTD至模式转换工具的两个链接。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者