说是complexType和simpleType的区别,其实主要区分的是simpleContent和complexContent的区别。
complexType下的complexContent和simpleContent | simpleType下没有Content这个选项
complexType+(。。。——simpleContent或complexContent。。。)+restriction或extension 其中restriction或extension的base属性只能是复合类型 || simpleType+restriction(可以用于element或attribute) restriction或extension的base属性只能是简单类型xs:positiveInteger
————————————————
一、simpleContent:restriction和extension是有区别的:base属性的引用类型不同(用于限制元素自己的值类型) |
用途2种:后面只+attribute,也可以不+attribute,这时只能为空(只修饰element内容) | 用于text only
* restriction(base属性必须是复杂类型数据引用)+(xmlns:ns1="http://www.w3schools.com”和targetNamespace="http://www.w3schools.com”必须有,且调用方必须加前缀)
* extension(是简单类型的——内置的xs:string 或 simpleType的引用)
二、complexContent:元素下有元素,且complexContent下必须接extension或restriction |
用途3种:empty(紧凑型),elementOnly,Mixed
* restriction用于绑定属性
* extension用于扩展子元素(配合指示器,另一个是在其它sequence基础上(复用其它sequence基础上)在添加自己的sequence序列; extension和restriction的base属性必须是 复杂类型引用 与simpleContent下的extension不一样,simpleContent下必须是简单类型的)
————————————————————
一:simpleContent
1、extension例子:
<xs:element name="shoesize">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="country" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
或没有属性
<xs:element name="shoesize">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
//空就行了,不能用simpleType里的声明length,pattern的属性
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
2、restriction例子:
<xs:complexType name="FamilyMountainBikeSizes">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="familyMember" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="ChildMountainBikeSizes">
<xs:simpleContent>
<xs:restriction base="ns1:FamilyMountainBikeSizes">
<xs:enumeration value="small"/>
<xs:enumeration value="medium"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
二:complexContent
1、restriction
属性的例子:
<xs:element name="product">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="ns1:TT">
<xs:attribute name="test" type="xs:string" fixed="abc"/> 必须是复杂类型引用,而且restriction只能 增加 引用的类型 的属性,名字和类型都不能变(照抄)
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="TT">
<xs:attribute name="test" type="xs:string"/>
</xs:complexType>
元素的例子:
<xs:complexType name="address">
<xs:sequence>
<xs:element name="street" type="xs:string" />
<xs:element name="city" type="xs:string" />
<xs:element name="zipcode" type="xs:integer" />
<xs:element name="country" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="USAddress">
<xs:complexContent>
<xs:restriction base="address">
<xs:sequence>
<xs:element name="street" type="xs:string" />
<xs:element name="city" type="xs:string" />
<xs:element name="zipcode" type="xs:integer" />
<xs:element name="country" type="xs:string" fixed="US" />
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
紧凑的:必须是空元素,必须有属性的写法才能紧凑
<xs:element name="product">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:integer"> 其实这种写法根本就是错误的,因为complexContent下的restriction和extension都必须是复杂类型的引用,这里只是说明一下罢了,其实根本不存在这样的写法
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
紧凑:
<xs:element name="product" type="prodtype"/>
<xs:complexType name="prodtype">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
2、extension
第一个例子:配合指示器choice all(任何顺序,但必须出现且仅能出现一次),choice(n选1且只能选1),sequence;
maxOccurs和minOccurs作为属性修饰element内部 maxOccurs=“unbounded"
<xsd:complexType name="ProductType">
<xsd:sequence>
<xsd:element name="number" type="ProdNumType"/>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ShirtType">
<xsd:complexContent>
<xsd:extension base="ProductType">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="size" type="SizeType"/>
<xsd:element name="color" type= "ColorType"/>
</xsd:choice>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
另一个例子:复用别人sequence,再+自己的sequence
<xs:element name="employee" type="ns1:fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="ns1:personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
base指定的Type在前,在什么什么的基础上再追加(在后面追加)