下面讲解
XML Schema【非常重要】:
我们自己写的
XML文件需要用Schema来验证有效性,而Schema恰恰也是一个XML文件,那么Schema这个XML文件的有效性用什么来验证呢?答案是用DTD来验证。用内置的XMLSchema.dtd来验证Schema文件(一个XML文件)的有效性。所以Schema里面定义命名空间的那个URL不能换成其他的,只能是http://www.w3.org/2001/XMLSchema,这里面包含了验证Schema有效性的DTD。
重点查看附件xml_3.pdf文档里面的内容,这个是上课的课件,里面详细讲解了Schema的相关内容,仔细阅读
研究。
下面是
自定义数据类型的一对使用示例:
class="xml"><?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="cat" type="xs:string"/>
<xs:element name="dog" type="xs:string"/>
<!--自定义数据类型,这种类型里面必须包含cat和dog两个元素,并且这两个元素都是字符串类型的-->
<xs:complexType name="myType">
<xs:sequence maxOccurs="unbounded">
<xs:element ref="cat"/>
<xs:element ref="dog"/>
</xs:sequence>
<!-- sequence表示按顺序,minOccurs表示最小出现次数,maxOccurs表示最大出现次数,unbounded表示最大出现次数没有限制 -->
</xs:complexType>
<!-- 定义了一个元素,这个元素的类型是自定义的myType类型 -->
<xs:element name="pets" type="myType"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<pets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema2.xsd">
<cat>123</cat>
<dog>456</dog>
</pets>
凡是在Schema里面定义的element元素,就表示在相应的XML里面直接用的,Schema里面定义的类型complexType是不能直接在XML里面使用的。类型是抽象的概念,比如定义的某个元素可以是牟某种类型的,类型不能直接在XML里面使用。
下面是日常Schema-XML开发中最常用到的一些Schema使用示例【非常重要,根据里面的
注释仔细研究,拷贝到XMLSpy里面运行起来】:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 把name、birthday、age三个放到一组里面,以后凡是使用myGroup的地方,这三个元素就会同时出现 -->
<xs:group name="myGroup">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:group>
<!-- 定义一个元素,这个元素引用上面定义的组myGroup -->
<xs:element name="person">
<xs:complexType>
<xs:group ref="myGroup"/>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema3.xsd">
<name>tom</name>
<birthday>2013-10-10</birthday>
<age>12</age>
</person>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:attribute name="interest" type="xs:integer"/>
<!-- person这个元素里面包含hello和world两个元素,并且它有一个属性interest,这个属性可有可无 -->
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="hello" type="xs:string"/>
<xs:element name="world" type="xs:string"/>
</xs:sequence>
<xs:attribute ref="interest"/>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema4.xsd" interest="123">
<hello></hello>
<world></world>
</person>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 属性组定义,hello属性必须有,world属性可有可无 -->
<xs:attributeGroup name="myAttributeGroup">
<xs:attribute name="hello" type="xs:string" use="required"/>
<xs:attribute name="world" type="xs:string" use="optional"/>
</xs:attributeGroup>
<!-- 这个元素里面不包含其他元素,里面是空的,但是它有一些属性,它引用了属性组myAttributeGroup -->
<xs:element name="myElement">
<xs:complexType>
<xs:attributeGroup ref="myAttributeGroup"/>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<myElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema5.xsd" hello="abc"></myElement>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义一个类型,如果有一个元素它的类型是myType,那么这个元素的值只能是介于0到100之间 -->
<xs:simpleType name="myType">
<xs:restriction base="xs:integer">
<xs:minExclusive value="0"/>
<xs:maxExclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="hello" type="myType"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema6.xsd">
10
</hello>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义一个类型,如果有一个元素它的类型是myType,那么这个元素的值只能是5、7、9中的一个 -->
<xs:simpleType name="myType">
<xs:restriction base="xs:integer">
<xs:enumeration value="5"/>
<xs:enumeration value="7"/>
<xs:enumeration value="9"/>
<!-- 定义的枚举类型,用户的元素值只能是这几个值当中的一个 -->
</xs:restriction>
</xs:simpleType>
<xs:element name="hello" type="myType"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema7.xsd">
5
</hello>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义一种类型,如果某个元素是这种类型,那么在这个元素里面可以使用itemType所指定的类型,只要我的所有元素值是属于所指定的类型就行。有一个元素值不属于这种类型就会报错。每个元素值中间用空格间隔 -->
<xs:simpleType name="myType">
<xs:list itemType="xs:integer"/>
<!-- list相当于一种集合一样 -->
</xs:simpleType>
<xs:element name="hello" type="myType"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema8.xsd">
1 2 3 78
</hello>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 定义一个属性。把roadbikeSize类型和mountainbikeSize类型作为allFrameSize这个属性的union的memberTypes的属性值(中间用空格间隔)。也就是说memberTypes值要么取roadbikeSize要么取mountainbikeSize,二者只能取一个。如果取roadbikeSize,那么memberTypes值是46、55、60中的一个;如果取mountainbikeSize,那么memberTypes值是small、medium、large中的一个。总结:属性allFrameSize只能是六选一 -->
<xs:attribute name="allFrameSize">
<xs:simpleType>
<xs:union memberTypes="roadbikeSize mountainbikeSize"/>
</xs:simpleType>
</xs:attribute>
<!-- 自定义一种类型,名字叫roadbikeSize,它的约定限制是基于正整数,从46、55、60这三个值里面选一个可以作为这个类型的值 -->
<xs:simpleType name="roadbikeSize">
<xs:restriction base="xs:positiveInteger">
<xs:enumeration value="46"/>
<xs:enumeration value="55"/>
<xs:enumeration value="60"/>
</xs:restriction>
</xs:simpleType>
<!-- 自定义一种类型,名字叫mountainbikeSize,它的约定限制是基于字符串,从small、medium、large这三个值里面选一个可以作为这个类型的值 -->
<xs:simpleType name="mountainbikeSize">
<xs:restriction base="xs:string">
<xs:enumeration value="small"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="large"/>
</xs:restriction>
</xs:simpleType>
<!-- 定义一个元素 -->
<xs:element name="hello">
<xs:complexType>
<xs:sequence>
<xs:element name="welcome" type="xs:string"/>
</xs:sequence>
<xs:attribute ref="allFrameSize" use="required"/>
<!-- 复杂类型,定义一个元素(子元素) -->
<!-- 定义一个属性,这个属性类型是allFrameSize -->
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema9.xsd" allFrameSize="small">
<welcome>
</welcome>
</hello>
========================以上都是simpleType的一些用法=====================
simpleType和complexType区别:
1、simpleType类型的元素中不能包含元素或者属性。
2、当需要声明一个元素的子元素和/或属性时,用complexType【特点:有子元素,同时有可能有属性,换句话说,属性和子元素里面必然至少有一个,或者两个都有。】;
3、当需要基于内置的基本数据类型定义一个新的数据类型时,用simpleType。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 根元素 -->
<xs:element name="showSize">
<!-- 这个元素是复杂类型 -->
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="sizing" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="us"/>
<xs:enumeration value="europe"/>
<xs:enumeration value="uk"/>
</xs:restriction>
<!-- sizing属性的值是一个枚举,可以从下面几个值里面选择一个 -->
</xs:simpleType>
</xs:attribute>
</xs:extension>
<!-- 表示showSize元素内容是decimal类型的(十进制的小数)。基于decimal进行扩展,十进制的,可以包含小数,对十进制有一个扩展 -->
<!-- 里面必定有一个名字叫做sizing的属性 -->
</xs:simpleContent>
<!-- simpleContent表示上面的showSize元素内容符合什么约定,<xs:simpleContent>标签中间的内容来表示这种约定 -->
<!-- simpleContent表示元素下不包括子元素但是可以包含属性,否则你直接用simpleType不就可以了么。complexType可以包含子元素,可以包含属性,但是使用simpleContent就是为了限定元素中间的内容是什么类型(也就是说元素中间必须有内容,不能是空的),不能包含子元素,但可以包含属性 -->
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<showSize xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema10.xsd" sizing="uk">
10
</showSize>
1. Schema(模式):其作用与dtd一样,也是用于验证
XML文档的有效性,只不过它提供了比dtd更强大的功能和更细粒度的数据类型,另外Schema还可以自定义数据类型。此外,Schema也是一个XML文件,而dtd则不是。
2. 所有的schema文档,其根元素必须为schema。
3. SimpleType与ComplexType的区别:
1) SimpleType类型的元素没有子元素,也没有属性。
2) 当需要定义的元素包含了子元素或者属性时,必须要使用ComplexType。
4. SimpleContent,用于ComplexType元素上,用于限定该ComplexType的内容类型,表示该ComplexType没有子元素,同时该ComplexType需要有属性,否则它就成为SimpleType了。
5. 通过DOCTYPE可以明确指定文档的根元素,因为DOCTYPE后面跟的元素就是文档的根元素【用DTD验证的情况下。】;通过Schema是没法明确指定目标XML文档的根元素,XmlSpy是通过推断哪个元素包含了其他元素来选择包含其他元素
最多的那个元素作为文档的根,但我们可以明确指定文档的根元素而不必按照XmlSpy的生成来做【并且Schema验证的XML文档根元素也不是固定的,是根据Schema具体内容来定。比如用下面这个Schema验证的XML文档的根元素就不是固定的,可以是
helloworld,也可以是welcome,用XmlSpy根据这个Schema生成XML文档的时候它会提示你选择根元素,选哪个都行,比如你选择了helloworld,那么在你的这个XML文档里面就不可能出现welcome了,选择welcome就不可能出现helloworld了。】。
注意sequence和choice的区别,下面这两组
例子(4个文件)做比较【重点】:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 这里表示myType这个复杂类型里面要么有hello这个子元素,要么有world这个子元素,二选一 -->
<xs:complexType name="myType">
<xs:choice maxOccurs="3">
<!-- choice里面定义的元素都相当于局部元素,只能在choice的选择中使用 -->
<xs:element name="hello" type="xs:string"/>
<xs:element name="world" type="xs:string"/>
</xs:choice>
<!-- choice里面的元素最多出现三次(和同一个元素重复出现没有关系,同一个元素出现三次也可以,不同元素出现三次也可以) -->
</xs:complexType>
<xs:element name="helloworld" type="myType"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<helloworld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema11.xsd">
<hello>123</hello>
<hello>123</hello>
</helloworld>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义一种类型,里面包含两个元素 -->
<xs:complexType name="myType">
<xs:sequence maxOccurs="3">
<xs:element name="hello" type="xs:string"/>
<xs:element name="world" type="xs:string"/>
</xs:sequence>
<!-- sequence表示序列,按照顺序执行。equence表示里面的元素都得出现,而且按照顺序,minOccurs和maxOccurs同样指的是整体一组,整体(两个元素必须同时出现,同时出现算作一次)要求最少出现一次,最多出现3次。 -->
</xs:complexType>
<xs:element name="helloworld" type="myType"/>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<helloworld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\Administrator\桌面\XML\myschema12.xsd">
<hello>abc</hello>
<world>xyz</world>
<hello>abc</hello>
<world>xyz</world>
<hello>abc</hello>
<world>xyz</world>
</helloworld>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 总结:通过DTD验证的XML文档,在DTD里面通过DOCTYPE可以明确指定文档的根元素,因为DOCTYPE后面跟的元素就是文档的根元素。而通过Schema验证的XML文档,是没法明确指定目标XML文档的根元素的,XmlSpy是通过推断哪个元素包含了其他元素来选择包含其他元素最多的那个元素作为文档的根,但我们可以明确指定文档的根元素而不必按照XmlSpy的生成来做,并且Schema验证的XML文档根元素也不是固定的,是根据Schema具体内容来定。比如用下面这个Schema验证的XML文档的根元素就不是固定的,可以是helloworld,也可以是welcome,用XmlSpy根据这个Schema生成XML文档的时候它会提示你选择根元素,选哪个都行,比如你选择了helloworld,那么在你的这个XML文档里面就不可能出现welcome了,选择welcome就不可能出现helloworld了。 -->
<xs:complexType name="myType">
<xs:sequence maxOccurs="3">
<xs:element name="hello" type="xs:string"/>
<xs:element name="world" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="helloworld" type="myType"/>
<xs:element name="welcome" type="myType"/>
</xs:schema>
附件为上课课件,详细笔记在里面
- xml_3.zip (2.3 MB)
- 下载次数: 0