l Quality Control,只看了DTD、Schema
DTD定义的主要有ELEMENT(元素)、ATTLIST(元素的属性),ENTITY(这个没用过),NOTATION(没用过)。可用<!ELEMENT plan (person+)>来表示1 个或多个(还有零个或一个用“?”,零个或多个用“*”。属性中可以用“#REQUIRED”,“#IMPLITED”表示必需或可选等(还可以用“#FIXED 3”表示省缺为3)。以下是plan.dtd的代码:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT plan (person+)>
<!ELEMENT person (group, name, task+)>
<!ELEMENT group (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT task (contend, date+)>
<!ELEMENT contend (#PCDATA)>
<!ELEMENT date (year, month, day)>
<!ATTLIST date
type (begintime | deadtime) #REQUIRED
>
<!ELEMENT year (#PCDATA)>
<!ELEMENT month (#PCDATA)>
<!ELEMENT day (#PCDATA)>
不过现在一般更加提倡用XML Schema。下面就将XML Schema与DTD比较:
1. 前者符合XML文档的规范,后者不是。
2. 可以对文档里每个元素出现的个数(minOcc和maxOcc)、每个元素的类型(complexType、simpleType)做出详细的规定,以及对元素顺序的支持。而后者定义元素个数仅零个、一个或多个的概念,在元素类型上仅有PCDATA,枚举等。
3. 在开发方面,用XMLSpy来做,对XSD文档提供了视图开发,比DTD方便了许多。
4. XSD中没规定XML的根结点,它可以对所有的Gloable Element进行验证。DTD中规定则根结点。
于是在XML Spy 的Schema的视图中,就可以看plan.xsd(定义的内容与plan.dtd一样)如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2006 rel. 3 sp1 (http://www.altova.com) by WuRH (NewlandComputer) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="plan">
<xsd:annotation>
<xsd:documentation>工作计划</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="person" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>员工</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="group" type="xsd:string">
<xsd:annotation>
<xsd:documentation>员工的工作小组</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="name" type="xsd:string">
<xsd:annotation>
<xsd:documentation>员工姓名</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="task" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>员工的任务</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="contend" type="xsd:string">
<xsd:annotation>
<xsd:documentation>任务信息</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="date" minOccurs="2" maxOccurs="2">
<xsd:annotation>
<xsd:documentation>任务周期</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="year" type="xsd:gYear">
<xsd:annotation>
<xsd:documentation>gYear</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="month" type="xsd:gMonth">
<xsd:annotation>
<xsd:documentation>gMonth</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="day" type="xsd:gDay">
<xsd:annotation>
<xsd:documentation>gDay</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="type" type="dateType" use="required">
<xsd:annotation>
<xsd:documentation>begintime/deadtime</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="dateType" final="list">
<xsd:annotation>
<xsd:documentation>时间类型</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="begintime"/>
<xsd:enumeration value="deadtime"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="per">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name"/>
<xsd:element name="group"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
以下代码都可以用XML Spy生成,有几个东西注意。
1.<xsd:element/>里有加<xsd:complexType/>才能再加子结点。其中<xsd:sequence/>是带顺序的结点(另外还有<xsd:choice/>表可选,<xsd:all/>表无顺序)。
2.可以自定义simpleType。如:
<xsd:simpleType name="dateType" final="list">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="begintime"/>
<xsd:enumeration value="deadtime"/>
</xsd:restriction>
</xsd:simpleType>
就表示创建枚举型。以下方法可以创建表示1-20内的数字:
<xsd:simpleType name="finiteNum">
<xsd:restriction base="xsd:int">
<xsd:minInclusive value="1"></xsd:minInclusive>
<xsd:minInclusive value="20">L</xsd:minInclusive>
</xsd:restriction>
</xsd:simpleType>
还要说明的xsd:gYear,xsd:gMonth, xsd:gDay的值是2006, -8, --1。