有人会问,DTD和Schema都是对XML文档的一种约束,为什么不就选其中之一,而又有Schema呢。因为DTD安全度太低了,也就是说它的约束定义能力不足,无法对XML实例文档做出更细致的语义限制。其实细心的人会发现,在DTD中,只有一个数据类型,就是PCDATA(用在元素中)和CDATA(用在属性中),在里面写日期也行,数字还行,字符更是没问题。而Schema正是针对这些DTD的缺点而设计的,Schema是完全使用XML作为描述手段,具有很强的描述能力,扩展能力和处理维护能力等。下面让我们看一个简单的例子吧: hello.xml -------------------
Hello World!! 说明:一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。 hello.xsd ----------
说明: XML Schema文档后缀名是.xsd,完全符合XML语法,根元素是schema,命名空间xmlns:xsd="http://www.w3.org/2001/XMLSchema,用元素
定义实例文档中的元素,如greeting。xsd:string就是定义的数据类型了,其中的数据类型有很多,比如:int,double,dateTime,Boolean,long,integer,float,等,总之Java等语言里有的数据类型它都有,但要以“xsd:”开头。让我们再看一个里面有子无素的例子: customer.xml -----------
teiki
No.237, Road Waitan, Shanghai则可以写出以下的XML Schema文档: customer.xsd ---------------- 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
说明:实例文档customer.xml中,
元素含有两个子元素,在Schema中凡是有两个以上的子元素,就认为是复杂类型的,所以我们在Schema文档中采用ComplexType来定义该元素。表示有多个XML子元素。 sequence表示子元素依次出现的顺序。如果有多层子元素怎么办呢,同样的道理,有几层写几层,一直往下嵌就OK了,这里我要说的是另一种方法,结构看上去会清晰一些。 address.xml ---------------
Teiki
Zhejiang
Hangzhou
Xilu Road, No.121, 7F 下面就是采用ref元素来编写的这个Schema文档: address2.xsd ---------------------- 1:
2:
3: 4:
5:
6:
7:
8:
9:
10:
11:
12: 13:
14:
15:
16:
17:
18:
19:
20:
21:
22: 23:
说明:如果按正常的写法,应该把13-21行的内容替换到每8行去,但这里使用ref元素可以直接将其指向另一个模块,使文档更加具有可读性。如果元素中包含属性怎么办呢?一样简单,只要在定义完子元素的后面再着定义属性就行了。定义属性用“attribute”,还是举个例子吧 customer2.xml ---------------
Teiki
No.237, Road Waitan, Shanghai这个例子和上面的一个例子差不多,只是在元素customer中设了一个属性id。 customer2.xsd ------------------ 1:
2:
3: 4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14: 15:
说明:需要注意的一点是,属性和元素不是一家的,所以要把它放在sequence外面写,但它们都在customer的孩子,所以要写在complexType的里面。下面再看一个例子: order4-1.xsd ---------------------- 1:
2:
3: 4:
5:
6:
7:
8:
9:
10:
11: 12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23: 24:
25:
26:
27:
28:
29:
30:
31: 32:
33:
34:
35:
36:
37:
38: 39:
上面的例子中,maxOccurs代表:相同元素最多出现的次数,与些相反的是minOccurs代表:出现的最少次数。默认情况下两个都为“1”,如果把minOccurs设为“0”,表示该元素可有可无。choice代表:可选的元素,也就是在这里面写的元素只能选其中之一,不能全写。simpleType代表自定义数据类型,也就是name里的并不是真正的数据类型,而是根据自己的意愿定制的。restriction代表对某一数据类型做约束,也就是只能取其中范围之内符合要求的,比如第25-29行中,里面又有个元素enumeration代表枚举,也就是只能在枚举的那几个中选一个,而下在的36-36行,里面又有一对元素minInclusive和maxInclusive代表类型的取值范围,也就是只能取大于等于minInclusive并且小于等于maxInclusive的数。把这个Schema用在XML中是这样的:
7-5005-6450-3
3
xyb
3
7-5005-6450-3
13
说明:红色的部分是导入Schema的命令,绿色的是Schema文件的路径,如果用XMLSPY写时,会自动加上。对属性的设置,基本上和元素的差不多。比如:
这里我们讲id属性类型作为一种自定义数据类型idType。它的格式就是上面用到的也就是类似于“7-5005-6450-3”样的。而且,用attribute元素的use属性来定义是否是必须的属性。 required是必须值,optional是可选值,prohibited是无属性值。default属性是默认值。
XML详解----Schema(精)[原创]
最新推荐文章于 2024-04-26 20:17:02 发布