XML第十一讲:XML与Schema深度剖析

来源:互联网 发布:管家婆软件不能打印 编辑:程序博客网 时间:2024/04/29 20:32

    上一讲我们讲解了Schema与XML的几种常用用法,现在我们来针对前面所学,做一下练习:

1. 分析XML实例,写出它的对应的Schema文件,先根据下面的框架写好XML文档,再根据对应的XML文档写Schema文件。

<学生名册>
    <学生 学号="1">
        <姓名>张三</姓名>
        <性别>男</性别>
        <年龄>20</年龄>
    </学生>
    <学生 学号="2">
        <姓名>李四</姓名>
        <性别>女</性别>
        <年龄>19</年龄>
    </学生>
    <学生 学号="3">
        <姓名>王五</姓名>
        <性别>男</性别>
        <年龄>21</年龄>
    </学生>
</学生名册>

1)根据上面内容,对应的XML文档如下所示:

<?xml version="1.0" encoding="UTF-8"?><学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd"><学生 学号="1"><姓名>张三</姓名><性别>男</性别><年龄>20</年龄></学生><学生 学号="2"><姓名>李四</姓名><性别>女</性别><年龄>19</年龄></学生><学生 学号="3"><姓名>王五</姓名><性别>男</性别><年龄>21</年龄></学生></学生名册>

2) 在写对应的Schema文档,我们先来剖析一下整个结构,并且理清一下如何书写的思路。先从大树着手,从宏观角度来分析

(1)根元素为学生名册,它包含了若干个学生,所以学生名册一定是一个complexType,一定是个复杂类型

(2)现在分析学生,它有属性,所以也一定是一个compleType,学生有一个学号属性attribute,学号用一个int来表示即可。所以学号写成xs:int 或者 xs:integer 都是可以的。

(3)学生下面有三个子元素,它们都是simpleType,简单类型

姓名:字符串
性别:男或者女,可以用 enumeration 枚举
年龄:介于 0 - 150 之间,所以可以用restriction base 加上一个范围

(4)以上就是整个文档结构,定义的时候可以先定义好类型,再去指定好元素,元素的Type等等定义的类型第二种方式是一下子直接定义完,也就是compleType定义在element里面,像内部类一样,我们采取第二种方式,第二种方式会更加简洁一点。

<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"><xs:element name="学生名册"><!--学生名册是个复合类型,学生名册里面有多个学生--><xs:complexType><!--学生名册里面有多个学生,所以可以用sequence--><!--每个sequence里面就一个元素:学生,而且它可以不断重复,0次或者多次--><xs:sequence minOccurs="0" maxOccurs="unbounded"><xs:element name="学生"><xs:complexType><!--学生下面是姓名、性别、年龄而且不是重复出现的,所以我们sequence后面就不添加属性了,它这样就表示下面的元素是各出现一次--><xs:sequence><!--姓名可以直接使用schema给我们提供的内置数据类型了--><xs:element name="姓名" type="xs:string"/><!--性别只能用simpleType定义了,男和女是基于字符串,二者选一个--><xs:element name="性别"><xs:simpleType><xs:restriction base="xs:string"><xs:enumeration value="男"/><xs:enumeration value="女"/></xs:restriction></xs:simpleType></xs:element><xs:element name="年龄"><xs:simpleType><xs:restriction base="xs:integer"><xs:minInclusive value="1"/><xs:maxInclusive value="150"/></xs:restriction></xs:simpleType></xs:element></xs:sequence><!--定义学生的属性:学号,注意是在学生的类型complexType里面定义--><xs:attribute name="学号" type="xs:integer"/></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:schema>

2. 总结一下:

1) Schema是另一种文档类型定义,它遵循XML的语言规范。
2) Schema是可扩展的,支持命名空间;
3) Schema支持更多的数据类型与元素类型;
4) Schema用element声明元素,用attribute声明元素的属性;
5) Schema用simpleType定义简单类型(不包含子元素,不包含属性),用complexType定义复杂类型(包含子元素或者包含属性,或者即包含子元素又包含属性的)。

好XML还得多联系啊!!