下面以一个学生名册的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输出窗口会有如下的结果显示
否则就算是多了一个空格都不会通过验证。这里我把dtd的验证写到了xml中,当然你也可以把它写到另一个文件中,该文件的后缀名为“.dtd”,然后把它关联到要验证的xml文档中,语法如下
1 <!DOCTYPE 根元素名 SYSTEM "*.dtd">
此处ID值好像要以字符开头,如果只是数字通不过验证。
学生信息中的性别,我把它定义为实体,然后通过实体引用它的值,要注意实体引用的语法是"&实体名;"。
下面通过XML Schema方式来验证
要验证的xml文档
复制代码
1 <?xml version="1.0" encoding="utf-8"?>
2 <学生名册 xmlns:xsi="https://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="https://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>
要验证的xml的文档通过在根元素开始标签中加入下面的信息关联XML Schema文档
1 xmlns:xsi="https://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编程很重要。