下面以一个学生名册的xml作为例子
<?xml version=1.0 encoding=utf-8?> <学生名册> <学生 学号=A1> <姓名>CIACs</姓名> <性别>男</性别> <年龄>22</年龄> </学生> <学生 学号=A2> <姓名>zhihao</姓名> <性别>男</性别> <年龄>23</年龄> </学生> </学生名册>
xml的首行一定要是<?xml version=1.0?>处理指令,且”<?xml”之间不能有空白,xml元素严格区分大小写,文档编码格式默认为“UTF-8”,版本只有1.0。上面的xml文档只能说是格式良好的xml文档,不能说是有效的(Vaild)xml文档。下面我们用两种方式去验证它。
首先是通过DTD来对它进行验证
<?xml version=1.0 encoding=UTF-8?> <!DOCTYPE 学生名册 [ <!ELEMENT 学生名册 (学生+)> <!ELEMENT 学生 (名字,性别,年龄)> <!ELEMENT 名字 (#PCDATA)> <!ELEMENT 性别 (#PCDATA)> <!ELEMENT 年龄 (#PCDATA)> <!ATTLIST 学生 学号 ID #required> <!ENTITY sex 男> ]> <学生名册> <学生 学号=A1> <名字>CIACs</名字> <性别>&sex;</性别> <年龄>22</年龄> </学生> <学生 学号=A2> <名字>zhihao</名字> <性别>&sex;</性别> <年龄>23</年龄> </学生> </学生名册>
否则就算是多了一个空格都不会通过验证。这里我把dtd的验证写到了xml中,当然你也可以把它写到另一个文件中,该文件的后缀名为“.dtd”,然后把它关联到要验证的xml文档中,语法如下
1 <!DOCTYPE 根元素名 SYstem *.dtd>
此处ID值好像要以字符开头,如果只是数字通不过验证。
学生信息中的性别,我把它定义为实体,然后通过实体引用它的值,要注意实体引用的语法是&实体名;。
下面通过XML Schema方式来验证
要验证的xml文档
<?xml version=1.0 encoding=utf-8?> <学生名册 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation=学生名册.xsd> <学生 学号=A1> <姓名>CIACs</姓名> <性别>男</性别> <年龄>22</年龄> </学生> <学生 学号=A2> <姓名>zhihao</姓名> <性别>男</性别> <年龄>23</年龄> </学生> </学生名册>
XML Schema验证文档
<?xml version=1.0 encoding=UTF-8?> <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema elementFormDefault=qualified attributeFormDefault=unqualified> <xs:element name=学生名册> <xs:complexType> <xs:sequence minOccurs=1 maxOccurs=unbounded> <xs:element ref=学生/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=学生> <xs:complexType> <xs:sequence> <xs:element name=姓名 type=xs:string/> <xs:element name=性别> <xs:simpleType> <xs:restriction base=xs:string> <xs:enumeration value=男/> <xs:enumeration value=女/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name=年龄> <xs:simpleType> <xs:restriction base=xs:integer> <xs:minexclusive value=0/> <xs:maxExclusive value=120/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:attribute name=学号 type=xs:string use=required/> </xs:complexType> </xs:element> </xs:schema>
要验证的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编程很重要。