当前位置: 首页 > 工具软件 > XSD/e > 使用案例 >

XSD学习:超详细解析XSD中simpleType,complexType, simpleContent, complexContent

伯庆
2023-12-01

  前两天用了一下DOM4J,解析自己写的xml,但已经习惯了用各种提示来写xml文件,自己写还真不爽,就学了一下XSD。其中的simpleType,complexType,  simpleContent和complexContent标签,我一开始学得很迷,w3school上讲的太简单,网上的博客大概也都是复制粘贴,很少添加自己的理解,所以我真要吐槽一下网上那些博客帖(¥%*&#&!#*)。 在这种情况的促使下这篇博客产生了,花了点时间研究了这几个标签,总算是理解了他们的基本用法。下面来分析一下。

simpleType:


概述: 定义一个简单类型, 用来规定和约束具有纯文本内容的元素(不含子元素即为具有纯文本内容的元素)或属性的值.

使用场景:

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:

概述: 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。

-----------------------------------------------------------------------------------------------------------------------------

simpleContent:

概述:
    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元素后面.



先写这么多吧,时间比较紧张, 想到别的再补充。。。。。

 类似资料: