XML&DTD&XML Schema学习

  XML(eXtensible Markup Language)可扩展的标记语言。xml在web service编程中尤其重要。在网络传输中能够做为传输数据的载体。xml做为元语言,它能够用来标记数据、定义数据类型,是一种容许用户对本身的标记语言进行定义的元语言。 它很是适合网络传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。能够实现异构语言、异构平台之间的交互。XML 文档定义方式有:文档类型定义(DTD)和XML Schema。DTD(Document Type Definition)定义了文档的总体结构以及文档的语法(下面会有相应的例子用于理解)应用普遍并有丰富的工具支持。XML Schema的功能更强大,用于定义管理信息等更强大、更丰富的特征。XML可以更细粒度地声明内容,定义约束,方便跨越多种平台的更有意义的传输内容。它提供了一种描述结构数据的格式,简化了网络中数据交换和表示,使得代码、数据和表示分离,并做为数据交换的标准格式,所以它常被称为智能数据文档。能够把DTD比做铁铲,而XML Schema就能够说是挖掘机,功能更强大。  XML虽然称做标记语言,但与HTML(超文本标记语言)不一样,它的格式更严格,标签必须封闭,显示与内容分离,XML描述的是文档的内容与语义而不是文档该如何显示。HTML有固定的标签,显示跟内容是一块儿的,不能建立本身的标签,而XML是可扩展的,内容与显示分离,每一个元素都成对出现,又开始就有结束,并且XML元素的嵌套关系要保持正确(嵌套中后开始的标记要先结束,先开始的标记要后结束),每个XML文档中只有一个根元素(Root Element),根元素包含了其余全部的元素。符合XML语法的XML文档在未被DTD或XML Schema验证时叫作良构(well form)的,若是良构的xml文档被DTD或XML Schema验证,这种xml文档称为有效(Valid)的。web

下面以一个学生名册的xml做为例子编程

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <学生名册>
 3     <学生 学号="A1">
 4         <姓名>CIACs</姓名>
 5         <性别></性别>
 6         <年龄>22</年龄>
 7     </学生>
 8 
 9     <学生 学号="A2">
10         <姓名>zhihao</姓名>
11         <性别></性别>
12         <年龄>23</年龄>
13     </学生>
14 </学生名册>

格式良好的xml文档,XMLSpy的输出窗口会输出以下结果网络

 

xml的首行必定要是<?xml version="1.0"?>处理指令,且”<?xml”之间不能有空白,xml元素严格区分大小写,文档编码格式默认为“UTF-8”,版本只有1.0。上面的xml文档只能说是格式良好的xml文档,不能说是有效的(Vaild)xml文档。下面咱们用两种方式去验证它。工具

首先是经过DTD来对它进行验证学习

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE 学生名册 [
 3 <!ELEMENT 学生名册 (学生+)>
 4 <!ELEMENT 学生 (名字,性别,年龄)>
 5 <!ELEMENT 名字 (#PCDATA)>
 6 <!ELEMENT 性别 (#PCDATA)>
 7 <!ELEMENT 年龄 (#PCDATA)>
 8 <!ATTLIST 学生 学号 ID #REQUIRED>
 9 <!ENTITY  sex "男">
10 ]>
11 
12 <学生名册>
13     <学生 学号="A1">
14         <名字>CIACs</名字>
15         <性别>&sex;</性别>
16         <年龄>22</年龄>
17     </学生>
18     
19     <学生 学号="A2">
20         <名字>zhihao</名字>
21         <性别>&sex;</性别>
22         <年龄>23</年龄>
23     </学生>
24 </学生名册>

若是验证经过的话,XMLSpy输出窗口会有以下的结果显示ui

不然就算是多了一个空格都不会经过验证。这里我把dtd的验证写到了xml中,固然你也能够把它写到另外一个文件中,该文件的后缀名为“.dtd”,而后把它关联到要验证的xml文档中,语法以下编码

 1 <!DOCTYPE 根元素名 SYSTEM "*.dtd"> spa

此处ID值好像要以字符开头,若是只是数字通不过验证。3d

学生信息中的性别,我把它定义为实体,而后经过实体引用它的值,要注意实体引用的语法是"&实体名;"。rest

 

下面经过XML Schema方式来验证

要验证的xml文档

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="学生名册.xsd">
 3     <学生 学号="A1">
 4         <姓名>CIACs</姓名>
 5         <性别></性别>
 6         <年龄>22</年龄>
 7     </学生>
 8 
 9     <学生 学号="A2">
10         <姓名>zhihao</姓名>
11         <性别></性别>
12         <年龄>23</年龄>
13     </学生>
14 </学生名册>

XML Schema验证文档

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
 3     <xs:element name="学生名册">
 4         <xs:complexType>
 5             <xs:sequence minOccurs="1" maxOccurs="unbounded">
 6                 <xs:element ref="学生"/>
 7             </xs:sequence>
 8         </xs:complexType>
 9     </xs:element>
10     <xs:element name="学生">
11         <xs:complexType>
12             <xs:sequence>
13                 <xs:element name="姓名" type="xs:string"/>
14                 <xs:element name="性别">
15                     <xs:simpleType>
16                         <xs:restriction base="xs:string">
17                             <xs:enumeration value="男"/>
18                             <xs:enumeration value="女"/>
19                         </xs:restriction>
20                     </xs:simpleType>
21                 </xs:element>
22                 <xs:element name="年龄">
23                     <xs:simpleType>
24                         <xs:restriction base="xs:integer">
25                             <xs:minExclusive value="0"/>
26                             <xs:maxExclusive value="120"/>
27                         </xs:restriction>
28                     </xs:simpleType>
29                 </xs:element>
30             </xs:sequence>
31             <xs:attribute name="学号" type="xs:string" use="required"/>
32         </xs:complexType>
33     </xs:element>
34 </xs:schema>

XMLSpy输出窗口的输出结果

 

要验证的xml的文档经过在根元素开始标签中加入下面的信息关联XML Schema文档

 1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="学生名册.xsd" 

以上的文档都是放在同一路径下的,因此直接引用文件名就好了。

从上面的两种验证方式咱们能够很清楚的看出DTD跟XML Schema验证的区别,二者一样是进行xml文档验证的,XML Schema提供了比DTD更为强大的功能和更细粒度的数据类型,并且Schema还能够自定义数据类型,其自己就是xml文件,但dtd的语法跟xml的语法不一样。虽然从代码量来看Schema大于dtd,可是当你学过Schema后你就会更喜欢用Schema。

学好xml和它的验证方式,对于后面学习web service编程很重要。