实验三 在XML文档中使用Schema
一、实验目的
通过本实验,使学生能够了解并掌握XML Schema的定义方法及其用途
(1)了解并掌握Schema的基本结构
(2)了解并掌握Schema的数据类型
(3)了解并掌握Schema的元素声明
(4)了解并掌握Schema的属性声明
二、实验条件
配置有windows记事本、写字板 或 XMLSpy开发环境的计算机设备。
三、实验原理及相关知识
XML Schema的语法规范
四、实验内容及步骤
1、对以下“book.xml”进行Schema定义(设Schema文件名为“bookinfo.xsd”)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这是一个用XML描述的例子 -->
<bookcase>
<book type="教育">
<b-name>XML实用培训教程</b-name>
<author>
<name>张健飞</name>
<E-mail>zjf@163.com</E-mail>
</author>
<price>27元</price>
<publishing-house>
<p-name>科学出版社</p-name>
<address>北京东皇城根北街16号</address>
<zipcode>100717</zipcode>
<E-mail>yanmc@bhp.com.cn</E-mail>
</publishing-house>
</book>
<book type="科技">
<b-name> XML网页制作彻底研究</b-name>
<author>
<name>陈会安</name>
<E-mail>cha@163.com</E-mail>
</author>
<price>47元</price>
<publishing-house>
<p-name>中国铁道出版社</p-name>
<address>北京市宣武区右安门西街8号</address>
<zipcode>100054</zipcode>
<E-mail>bjb@tqbooks.com.cn</E-mail>
</publishing-house>
</book>
</bookcase>
(1)在XMLSpy中新建XML Schema文档“bookinfo.xsd”,其内容如下:
XML Schema定义头部:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
[…………]
</xs:schema>
(2)定义bookcase元素(添加在[…………]处)
<xs:element name="bookcase">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="book" type="bookType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
(3)定义bookType类型(里面引用定义authorType, pub-houseType,添加在bookcase元素定义之后)
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="b-name" type="xs:string"/>
<xs:element name="author" type="authorType"/>
<xs:element name="price" type="xs:string"/>
<xs:element name="publishing-house" type="pub-houseType"/>
</xs:sequence>
<xs:attribute name="type">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="科技"/>
<xs:enumeration value="教育"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
(4)定义authorType及pub-houseType元素类型(添加在bookType类型定义之后)
<xs:complexType name="authorType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="E-mail" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="pub-houseType">
<xs:sequence>
<xs:element name="p-name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="zipcode" type="xs:string"/>
<xs:element name="E-mail" type="xs:string"/>
</xs:sequence>
</xs:complexType>
(5)在XMLSpy中创建一个基于“bookinfo.xsd”的XML文件“book-onschema.xml”。
(6)在IE中打开XML Schema文件“bookinfo.xsd”和带有Schema定义的“book-onschema.xml”,观察带有Schema的XML文件显示。
验证:
2、XML文档如下:
<?xml version="1.0" encoding="UTF-8"?>
<order xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:noNamespaceSchemaLocation="e3-2.xsd">
<orderItem>
<id>7-5005-6450-1</id>
<quatity>3</quatity>
</orderItem>
<orderItem>
<id>7-5005-6450-2</id>
<customer>xyz</customer>
<quatity>5</quatity>
</orderItem>
<orderItem>
<id>7-5005-6450-3</id>
<quatity>7</quatity>
</orderItem>
</order>
请为以上XML文档编写合适的XML Schema,并根据创建的XML Schema文档对XML进行有效性验证。其中,元素id的取值格式为:
1位数字-4位数字-4位数字-1位数字
e3-2.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="order">
<xs:complexType>
<xs:sequence minOccurs="3" maxOccurs="3">
<xs:element name="orderItem" type="orderItemType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="orderItemType">
<xs:sequence>
<xs:element name="id" type="idType"/>
<xs:element name="customer" type="xs:string" minOccurs="0"/>
<xs:element name="quatity" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="idType">
<xs:restriction base="xs:string">
<xs:length value="13"/>
<xs:pattern value="\d{1}-\d{4}-\d{4}-\d{1}"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
e3-2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///F:/测试/XML/e3-2.xsd">
<orderItem>
<id>7-5005-6450-1</id>
<quatity>3</quatity>
</orderItem>
<orderItem>
<id>7-5005-6450-2</id>
<customer>xyz</customer>
<quatity>5</quatity>
</orderItem>
<orderItem>
<id>7-5005-6450-3</id>
<quatity>7</quatity>
</orderItem>
</order>
验证:
3、根据实验一中的“person.xml”文件,编写对应的“person.xsd”文件,并使用XMLSpy 对“person.xsd”和“person.xml”进行有效性性验证,若有错误,按照提示进行修改。
person.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Persons">
<xs:complexType>
<xs:sequence minOccurs="5" maxOccurs="5">
<xs:element name="person" type="personType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="personType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="age_type"/>
<xs:element name="address" type="address_type"/>
<xs:element name="telephonenumber" type="telephonenumber_type"/>
<xs:element name="e-mail" type="xs:string"/>
</xs:sequence>
<xs:attribute name="sex">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:simpleType name="age_type">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="110"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="address_type">
<xs:sequence>
<xs:element name="province" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="zip-code" type="zip-code_type">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="zip-code_type">
<xs:restriction base="xs:string">
<xs:length value="6"/>
<xs:pattern value="\d{6}"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="telephonenumber_type">
<xs:restriction base="xs:string">
<xs:length value="11"/>
<xs:pattern value="\d{11}"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
person_onxsd.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///F:/测试/XML/person.xsd">
<person sex="男">
<name>小黑</name>
<age>18</age>
<address>
<province>河南省</province>
<city>郑州市</city>
<street>文化路街道</street>
<zip-code>450000</zip-code>
</address>
<telephonenumber>18888888888</telephonenumber>
<e-mail>66667777@qq.com</e-mail>
</person>
<person sex="女">
<name>小红</name>
<age>17</age>
<address>
<province>陕西省</province>
<city>西安市</city>
<street>汉城街道</street>
<zip-code>710000</zip-code>
</address>
<telephonenumber>17777777777</telephonenumber>
<e-mail>55556666@qq.com</e-mail>
</person>
<person sex="男">
<name>小明</name>
<age>22</age>
<address>
<province>湖北省</province>
<city>武汉市</city>
<street>金银湖街道</street>
<zip-code>430000</zip-code>
</address>
<telephonenumber>13263637878</telephonenumber>
<e-mail>77778888@qq.com</e-mail>
</person>
<person sex="女">
<name>小紫</name>
<age>19</age>
<address>
<province>山西省</province>
<city>太原市</city>
<street>桥东街道</street>
<zip-code>030000</zip-code>
</address>
<telephonenumber>15566669999</telephonenumber>
<e-mail>32152659@qq.com</e-mail>
</person>
<person sex="男">
<name>李某某</name>
<age>20</age>
<address>
<province>河南省</province>
<city>某某市</city>
<street>某某大街</street>
<zip-code>456200</zip-code>
</address>
<telephonenumber>17355669988</telephonenumber>
<e-mail>26068823@qq.com</e-mail>
</person>
</Persons>
验证:
五、思考题及其它
(1)Schema与DTD的共同点和区别是什么?
共同点:都是通过对文档结构的定义和描述来约束XML文件,使之实现规格化的
区别:
①Schema本身也是XML文档,DTD定义跟XML没有什么关系,Schema在理解和实际应用有很多的好处。
②DTD文档的结构是“平铺型”的,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系;Schema文档结构性强,各元素之间的嵌套关系非常直观。
③DTD只能指定元素含有文本,不能定义元素文本的具体类型,如字符型、整型、日期型、自定义类型等。Schema在这方面比DTD强大。
④Schema支持元素节点顺序的描述,DTD没有提供无序情况的描述,要定义无序必需穷举排列的所有情况。Schema可以利用xs:all来表示无序的情况。
⑤对命名空间的支持。DTD无法利用XML的命名空间,Schema很好满足命名空间。并且,Schema还提供了include和import两种引用命名空间的方法。
(2)Schema符合XML语法有什么优点?
①不必学习新的语言
②可使用 XML 编辑器来编辑 Schema 文件
③可使用 XML 解析器来解析 Schema 文件
④可通过 XML DOM 来处理 Schema
⑤可通过 XSLT 来转换 Schema