schema

来源:互联网 发布:汉王ocr软件 编辑:程序博客网 时间:2024/04/30 14:46

Schema(模式):其作用与dtd一样,也是用于验证XML文档的有效性,只不过它提供了比dtd更强大的功能和更细粒度的数据类型,另外Schema还可以自定义数据类型。此外,Schema也是一个XML文件,而dtd则不是。

所有的schema文档,其根元素必须为schema

Schema本身也应该是一个有效的xml文件,它里面的xmlns的那个url是不能变的,Schema本身是个xml,那它又是用什么来规范它验证它的呢?是用DTD.url那里的东西就有.dtd是本源.

schema总结:它的结构,各种元素及其比较,元素的声明方式等,如complexType声明在元素的外部和内部, 数据类型,注意uinon就是并集的意思

Schema的文档结构:

Schema的数据类型

•简单类型
–内置的数据类型(built-in data types)
•基本的数据类型
•扩展的数据类型
–用户自定义数据类型(通过simpleType定义)
•复杂类型(通过complexType定义)

基本数据类型:


可以直接使用他们。内置数据类型又分为基本数据类型和派生数据类型。如下表所示:
派生数据类型
由基本数据类型派生出来的数据类型有如下几种:
? ID:用于唯一标识元素
? IDREF:IDREF类型的含义和使用与DTD中的类似。
? IDREFS:IDREFS类型的含义和使用与DTD中的类似。
? ENTITY:实体类型,与DTD中的类似。
? ENTITIES:ENTITIES类型的含义和使用与DTD中的类似。
? NMTOKEN:NMTOKEN类型,与DTD中的类似。
? NMTOKENS:NMTOKENS类型集,与DTD中的类似。
? long:表示长整型数大小在-9223372036854775808和9223372036854775807之间
? int:表示整型数,大小在-2147483648和2147483647之间。
? short:表示短整型数,大小在-32768和32767之间。
? byte:表示整型数,大小在-128和127之间。
数据类型的属性
每种数据类型都有不同的属性,数据类型的属性主要包括以下几种:
? enumeration:在指定的数据项中选择,限定用户的选值。
? fractionDigits:限定最大的小数位,用于控制精度。
? length:指定数据的长度。
? maxExclusive:指定数据的最大值,不包含该最大值。
? maxInclusive:指定数据的最大值,包含该最大值。
? maxLength:指定长度的最大值,长度单位取决于数据类型。
? minExclusive:指定最小值,不包含该最小值。该值的数据类型必须与继承的数据类型相同。
? minInclusive:指定最小值,包含该最小值。
? minLength:指定最小长度。
? pattern:指定数据的显示规范。
用户自定义数据类型
用户在对数据类型进行自定义时,主要是通过simpleType定义,并通过simpleType元素的name属性值作为该自定义数据类型的名称。如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定义类型mytype -->
<xs:simpleType name="mytype">
<xs:restriction base="xs:string">
<xs:enumeration value="男"></xs:enumeration>
<xs:enumeration value="女"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
<!-- 使用自定义类型mytype -->
<xs:element name="name" type="mytype"/>
</xs:schema>
复杂数据类型
复杂数据类型的定义主要是通过complexType定义。并通过complexType元素的name属性值作为该自定义数据类型的名称。如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="student">
<xs:complexType>
<xs:sequence>
<xs:element name="address" type="mytype" >
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- 用complexType定义一个复杂数据类型mytype-->
<xs:complexType name="mytype">
<xs:sequence>
<xs:element name="北京" type="xs:string"/>
<xs:element name="上海" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

 

Schema的元素类型:

•schema
•element                                chioce
•attribute                               list
•group                                    union
•attributeGroup                      unique
•simpleType                            sequence
•simpleContent                      restriction
•complexType

用Schema约束XML文档
使用schema合理控制元素之间的关系

元素与元素之间存在着父子关系、包含关系、继承关系等,我们可以通过Schema中定义的各种类型元素来描述元素之间的关系。例如我们可以用complexType和sequence类型来描述父子关系、包含关系,用group类型来描述兄弟关系等。如下:
<!-- “Items”和“item”元素之间存在父子关系 -->
<xs:complexType name="Items">
<xs:sequence>
<xs:element name="item" minOccurs="0"
maxOccurs="unbounded">
<!--“item”和“productName”元素之间存在父子关系-->
<xs:complexType>
<xs:sequence>
<xs:element name="productName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
使用complexType和sequence类型来描述“Items”与“item”元素之间及“item”与“productName”元素之间的父子关系:
使用schema文件对XML文档约束
在XML文档中使用已经编写好的schema文件的一般格式如下:
<class xmlns="http://tempuri.org/po.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/po.xsd test.xsd">
</class>
“class”表示根元素,其中xmlns:xsi是在文档中声明“XML 模式实例”名称空间,以授予对引用XML模式时需要的属性的访问权。当然,要添加前缀映射(xsi)和相关URL。xmlns是为所有没有前缀的元素提供缺省命名空间。
同时我们可以通过设置schemaLocation属性的值,让该文档应用多个schema文件。schemaLocation 属性如下:
<xsi:schemaLocation="http://tempuri.org/po.xsd D:/XML/Schema/test1.xsd
D:/XML/Schema/test2.xsd">

注意上面的文件的路径可以用相对路径

SimpleType与ComplexType的区别:
1) SimpleType类型的元素没有子元素,也没有属性。
2) 当需要定义的元素包含了子元素或者属性时,必须要使用ComplexType。即子元素和属性至少要有一个

 

SimpleContent,用于ComplexType元素上,用于限定该ComplexType的内容类型,表示该ComplexType没有子元素,同时该ComplexType需要有属性,否则它就成为SimpleType了。

 

在DTD中通过DOCTYPE可以明确指定文档的根元素,因为DOCTYPE后面跟的元素就是文档的根元素;通过Schema是没法明确指定目标XML文档的根元素,XmlSpy是通过推断哪个元素包含了其他元素来选择包含其他元素最多的那个元素作为文档的根,但我们可以明确指定文档的根元素而不必按照XmlSpy的生成来做。

 

原创粉丝点击