前两天用了一下DOM4J,解析自己写的xml,但已经习惯了用各种提示来写xml文件,自己写还真不爽,就学了一下XSD。其中的simpleType,complexType, simpleContent和complexContent标签,我一开始学得很迷,w3school上讲的太简单,网上的博客大概也都是复制粘贴,很少添加自己的理解,所以我真要吐槽一下网上那些博客帖(¥%*&#&!#*)。 在这种情况的促使下这篇博客产生了,花了点时间研究了这几个标签,总算是理解了他们的基本用法。下面来分析一下。
概述: 定义一个简单类型, 用来规定和约束具有纯文本内容的元素(不含子元素即为具有纯文本内容的元素)或属性的值.
使用场景:
1.规定一个元素纯文本部分的类型,或规定一个元素属性的所属类型的时候
2.当我们对一个元素纯文本的值,元素属性的值需要一些限制的时候.(还有其他的使用场景,不过不常用,想了解请自行 查看文档,下同)
用法:
1)规定一个元素纯文本内容的类型
<xsd:element name="description" type="xsd:string"/>
ps:这里虽然我没有定义一个simpleType,但"xsd:string"本身就是一个simpleType(事实上schema中所有的内置类型都是simpleType),
它属于名为"xsd"的namespace中,"Ctrl+鼠标左键"点开可以查看类型.
<xs:simpleType name="string" id="string">
<xs:annotation>
<xs:appinfo>
<hfp:hasFacet name="length"/>
<hfp:hasFacet name="minLength"/>
<hfp:hasFacet name="maxLength"/>
<hfp:hasFacet name="pattern"/>
<hfp:hasFacet name="enumeration"/>
<hfp:hasFacet name="whiteSpace"/>
<hfp:hasProperty name="ordered" value="false"/>
<hfp:hasProperty name="bounded" value="false"/>
<hfp:hasProperty name="cardinality" value="countably infinite"/>
<hfp:hasProperty name="numeric" value="false"/>
</xs:appinfo>
<xs:documentation
source="http://www.w3.org/TR/xmlschema-2/#string"/>
</xs:annotation>
<xs:restriction base="xs:anySimpleType">
<xs:whiteSpace value="preserve" id="string.preserve"/>
</xs:restriction>
</xs:simpleType>
2)规定一个元素属性的所属类型
<xsd:element name="worker">
<xsd:complexType>
<xsd:attribute name="id" type="idType"/>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="idType">
<xsd:restriction base="xsd:integer"/>
</xsd:simpleType>
代码解释:
我定义了一个"worker"元素,并规定它具有一个"id"属性,这个属性的类型为"idType", 这是我自定义的一个simpleType,这个simpleType中规定了属性值的类型.
当然也可以直接将"attribute"的"type"属性设置为"xsd:integer",但我这样写是为了让读者更直观的看出simpleType确实可以规定一个元素属性的数据类型.
3)若父标签是element,则用来约束父标签所定义元素的纯文本内容.
<xsd:element name="gender">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Male"/>
<xsd:enumeration value="Female"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
代码解释:
这个simpleType规定了它的父标签所定义的"gender"元素的纯文本内容是string类型,并且只能取"Male"和"Female"两个值, 起到了约束的作用.
4)若父标签是attribute,则用来约束父标签所定义的属性值
<xsd:element name="person">
<xsd:complexType>
<xsd:attribute name="gender">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Male"/>
<xsd:enumeration value="Female"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
代码解释:
这个simpleType规定了它的父标签所定义的"person"元素的gender属性值是string类型的,且只能取"Male"和"Female"两个值.
概述: complexType 元素定义复杂类型。复杂类型的元素是包含其他元素和/或属性的 XML 元素。
用法:
<xsd:element name="student">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="id" type="xsd:int"></xsd:element>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="gender" type="xsd:string"></xsd:element>
<xsd:element name="addr" type="xsd:string"></xsd:element>
</xsd:sequence>
<xsd:attribute name="class" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
代码解释:这个complexType为student元素定义了一个复杂类型, 这个类型中包含了四个子元素:id,name,gender,addr,并且使用了sequence指示器指定了这四个子元素的顺序. 还包含了一个class属性.
总结simpleType和complexType的区别:
simpleType用来定义简单数据类型,其中可以包含对该类型内容的限制.可以指定某属性或元素属于某simpleType,从而起到规定元素文本内容和属性的作用.
complexType定义复杂数据类型,包含复杂的结构,如属性、序列关系(sequence)、选择关系(choice)等等,一般用于定义元素内容,可以指定某元素属于某complexType。
-----------------------------------------------------------------------------------------------------------------------------
概述:
W3School上的解释: simpleContent元素包含对complexType元素(它以字符数据或simpleType元素为内容)的扩展或限制并且不包含任何元素。
我自己的理解:
简单来说就是继承一个包含了simpleContent的complexType或继承一个simpleType,并对其进行扩展(比如添加属性)或限制(比如限制文本内容的长度)的操作.
常用的使用场景:
1.当要定义一个只含属性和元素文本而不含子元素的元素时,(也就是扩展一个simpleType)
2.扩展一个包含简单类型的complexType的属性
3.约束一个包含简单类型的complexType的属性值,文本内容等
4......
举个例子分析这三种使用场景:
<xsd:element name="goods" type="e_fType3"/>
<xsd:simpleType name="fType">
<xsd:restriction base="xsd:float">
<xsd:minExclusive value="0"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="e_fType1">
<xsd:simpleContent>
<xsd:extension base="fType">
<xsd:attribute name="description">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="20"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="e_fType2">
<xsd:simpleContent>
<xsd:extension base="e_fType1">
<xsd:attribute name="num" type="xsd:string"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="e_fType3">
<xsd:simpleContent>
<xsd:restriction base="e_fType2">
<xsd:maxExclusive value="1000"/>
</xsd:restriction>
</xsd:simpleContent>
</xsd:complexType>
代码解释:
首先定义一个goods元素,类型为"e_fType3","e_fType3"派生自"e_fType2",并进行了约束. 而"e_fType2"派生自"e_fType1"并对"e_fType1"进行了约束, "e_fType1"派生自"fType"并对"fType"进行了扩展.
1) 定义一个只含属性和元素文本而不含子元素的元素(使用场景1)
"fType"是一个simpleType,定义了goods元素的文本为float类型的数值,并限制了最小值必须大于0(<xsd:minExclusive value="0"/>),
"e_fType1"是一个complexType,继承"fType"(使用了simpleContent),并对其扩展(使用了extension,且base="fType"),这里为"fType"扩展了一个名为"description"
的attribute,并使用上文讲解过的"simpleType"对属性的值进行限制.
2) 扩展一个包含简单类型的complexType的属性(使用场景2)
"e_fType2"是一个complexType,继承"e_fType1",并扩展了一个名为"num"的attribute.
3) 约束一个包含简单类型的complexType的属性值,文本内容等(使用场景3)
"e_fType3"是一个complexType,继承"e_fType2",并限制了goods元素文本内容(类型为float数值)的最大值必须小于1000.
complexContent:
概述:complexContent 元素定义对复杂类型(包含混合内容或仅包含元素)的扩展或限制。
例子:
<xsd:complexType name="action">
<xsd:sequence>
<xsd:element name="run" type="xsd:string"/>
<xsd:element name="shout" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="animal">
<xsd:complexType>
<xsd:complexContent>
<!-- 若extension中base属性值指定的内容类型是simpleContent, 则不允许扩展子元素 -->
<xsd:extension base="action">
<xsd:sequence>
<xsd:element name="jump" type="xsd:string"/>
<xsd:element name="sleep" type="xsd:string"/>
</xsd:sequence>
<!-- attribute元素必须写在sequence元素后面,否则报错 -->
<xsd:attribute name="id" type="xsd:int"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
代码解释:
我定义了一个名为"action"的compleType来表示一系列行为. 定义了一个"animal"元素, 并继承了"action"类型, 并对其进行了扩展了两个子元素和一个属性.
注意我在代码中写的注释:若extension的base属性值指定为一个包含简单类型的complexType,则不能对其扩展子元素. attribute元素必须写在sequence元素后面.
先写这么多吧,时间比较紧张, 想到别的再补充。。。。。