DTD与XML Schema

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>
posted @ 2020-01-27 23:02  被罚站的树  阅读(212)  评论(0编辑  收藏  举报