XML是一种数据格式化语言,用于描述复杂的数据结构。而DTD/Schema是规范XML文档,对XML文档的书写进行约束
XML DTD
一个例子
DTD约束文档
<!ELEMENT books (book)>
<!ELEMENT book (name,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
在DTD文档中定义book Tag的相关属性
XML文档
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE books SYSTEM "books.dtd">
<books>
<book>
<name>java</name>
<price>$16</price>
</book>
</books>
在XML文档中引入DTD约束,因为DTD中规定books Tag有book组成,因此在XML中books Tag需有book child Tag,
DTD中规定book Tag由name和price组成,因此XML文档中book Tag必须有name和price
当然DTD和XML可以写在同一个文件中
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE users [
<!ELEMENT users (user*)>
<!ELEMENT user (id,username,password,email,birthday)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
]>
<users>
<user>
<id>1</id>
<username>1</username>
<password>1</password>
<email>1</email>
</user>
</users>
XML引入DTD
XML中有两个方式引入DTD,一种是直接引入,即将DTD和XML写在同一个文档中。还有一种是外部引入。外部引入分为本地和公共。本地表示自定义DTD,而公共则表示大家共同认可的DTD。
本地引入DTD
<!DOCTYPE root-element SYSTEM "filename">
引入公共DTD
<!DOCTYPE root-element PUBLIC "DTD-NAME" "URL">
很少有自定义DTD,大部分开发场景下都使用公用DTD,关于DTD可参考DTD定义
XML Schema
xml Schema使用预先定义好的元素和属性开发的,其本身就是XML文档(这与DTD不同),通过Schema再来规定XML实例文档。由于一个XML实例文档可以引入多个Schema,为了避免元素重名问题,每个Schema都应有一个名称空间(这里使用URI来区分)。由于定义Schema文档时要用到预先定义的属性和元素,因此需引入W3C组织规定的scheme,即xmlns="http://www.w3.org/2001/XMLSchema"
约束文档
<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNameSpace="http://www.dy-pc.com"
elementFormDefault = "qualified"
>
<element name="books">
<complexType>
<sequence>
<element name="book">
<squence>
<element name="name" type="string" />
<element name="price" type="double" />
</squence>
</element>
</sequence>
</complexType>
</element>
XML文档
<?xml version="1.0" encoding="utf-8" ?>
<books xmlns="http://www.dy-pc.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.dy-pc.com test.xsd">
<book>
<name>java</name>
<price>$16</price>
</book>
</books>