看下面这段简单的xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="ddd">
<xs:annotation>
<xs:documentation>Comment describing your root
element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="bbb">
<xs:complexType>
<xs:choice>
<xs:element name="t"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:group ref="eg" minOccurs="0"/>
<xs:element name="eee" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:group name="eg">
<xs:choice>
<xs:element name="a"/>
<xs:element name="b" minOccurs="0"/>
<xs:element name="c"/>
</xs:choice>
</xs:group>
</xs:schema>
下面是符合此xsd的一种xml格式:
<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2005 rel. 3 U (http://www.altova.com)-->
<ddd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="D:\WordML\testchoice.xsd">
<bbb>
<t></t>
</bbb>
<a></a>
<eee></eee>
</ddd>
xsd分析:
1、xsd包含一个元素和一个组
2、ddd是复杂类型包含一个sequence,采用的是minocc、maxocc的默认值1,这要求sequence的每个子元素仅且只能呈现一次(但是这并不是说ddd中的bbb、eg、eee只能出现一次,他们可以出现0次或者多次,这要靠这些子级的定义决定,但是验证器在此时确只知道“sequence的子元素必须呈现一次,不多不少”)
3、sequence的子元素,第一个bbb也是CT类型,并且包含默认值同样是1的choice,因此ddd必须包含类似“<bbb><t></t></bbb>”的结构
4、第二个子级是group,group的minocc=0;这就决定了eg组是可以省略掉的。这也说明符合此xsd的xml文档的从这此开始变化,可以有不同的xml了。(再往下可以看到b元素可以为0次,这也说明即使eg组的minocc不等于0,eg组也是可以不被呈现出来的。)
5、最后是eee元素,minocc=0,这也说明eee是可以省略的。(同样,如果把它的maxocc改为大于1,这样ddd就可以包含多个eee了)
从此可以看出符合此xsd架构的最简单xml其实只要求必须包含一次bbb以及它的子元素。
验证器是走一步看一步的,它只要求当前对象符合xsd就可以了,不会去预测子级。