XSD用来验证XML内容的有效性,当开发基于SOAP的WEB SERVICE时,发现我们经常需要定义wsdl。虽然"代码优先"的开发模式不需要我们手动书写wsdl。如果我们了解基本的XSD知识,那么我们就能更轻易的读懂wsdl的内容以及根据需要修改wsdl。
本文将开发一个验证代表学生成绩的XSD。
由于eclipse带有XSD的可视化编辑器。所以我使用eclipse来创建XSD,具体的步骤如下
一、新建一个工程,比如test-xsd
二、工程上右键->new->XML-XML Schema File->next
编辑完成后的结果如图:
三、在图中的type标签内添加你希望定义的类型(Type)。
常用的元素种类有simpleType和complexType,simpleType的作用是对已有的数据类型进行范围的限制,complexType定义复合的数据类型。eclipse的XSD编辑器只会帮我们生产XSD框架,具体的规则我们可以切换到source视图进行代码编辑。
四、本示例最后产生的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 |
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.javacoder.cn/scores" xmlns:tns="http://www.javacoder.cn/scores" elementFormDefault="unqualified"> <simpleType name="sex"> <restriction base="string"> <enumeration value="MAN" /> <enumeration value="WOMAN" /> </restriction> </simpleType> <simpleType name="username"> <restriction base="string"> <pattern value="\w{2,6}"/> </restriction> </simpleType> <simpleType name="score"> <restriction base="double"> <minInclusive value="0" /> <maxInclusive value="100" /> </restriction> </simpleType> <complexType name="classScore" > <sequence> <element name="cid" type="string"/> <element name="cname" type="string"/> <element name="score" type="tns:score"/> </sequence> </complexType> <complexType name="student"> <sequence> <element name="username" type="tns:username" /> <element name="sex" type="tns:sex"/> <element name="averageScore" type="tns:score" /> <element name="classScore" type="tns:classScore" minOccurs="1" maxOccurs="unbounded" /> </sequence> </complexType> <element name="student" type="tns:student" /> </schema> |
对本示例使用的元素解释如下:
在本XSD中,没有带前缀的元素都来y于xmlns="http://www.w3.org/2001/XMLSchema"命名空间,比如simpleType,complexType,element等等。
targetNamespace:表示本XSD中定义的element和type属于的namespace。防止命名冲突,和java的包的概念相同。
xmlns:tns:tns前缀表示本XSD的命名空间
elementFormDefault: 本XSD的元素默认是否需要带前缀,"unqualified"表示不带。
sex类型是一个枚举值。子元素<restriction>表示sex的基类为string。可选的值为"MAN"和"WOMAN"。<simpleType>合法的子元素还有<list>表示是列表,<union>指定的类型的联合。
username类型是满足"\w{2,6}"正则表达式的字符串。
score类型是规定了最小值和最大值的double值。
classScore是一个复合类型,定义了三个域,cid,cname, score。而score的类型为本XSD中定义的tns:score类型。<sequence>表示各个域安顺序排列,可选的还有<choice>任选一个,<all>全部但是可以任意排序。
student也是一个复合类型,值得注意的是属性minOccurs="1" 和maxOccurs="unbounded",表示该域至少出现一次,可以无限次。
五、工程上右键->new->XML->create XML file from an XML file->选择你的XSD文件。
产生的示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version="1.0" encoding="UTF-8"?> <tns:student xmlns:tns="http://www.javacoder.cn/scores" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.javacoder.cn/scores"> <username>123456</username> <sex>MAN</sex> <averageScore>11</averageScore> <classScore> <cid>1</cid> <cname>Chinese</cname> <score>98</score> </classScore> <classScore> <cid>2</cid> <cname>English</cname> <score>33</score> </classScore> </tns:student> |
示例XML有两个classScore对象
虽然行文比较冲忙,但是也希望能给看官一点启发和帮助,欢迎留言反馈!
参考文档:
Comments are closed.