DTD与XML基本语法规则

前端之家收集整理的这篇文章主要介绍了DTD与XML基本语法规则前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

DTD(文档类型定义)可以定义合法的XML文档结构,它使用一系列合法元素来定义文档的结构。DTD分为内部DTD和外部DTD,所谓内部DTD是指该DTD在某个文档的内部,只被该文档使用。外部DTD是指该DTD不在文档内部,可以被其他所有的文档来共享。DTD文档与XML文档实例的关系可以看成是类和对象的关系。

(1)外部DTD文件的编写及引用

新建一个外部family.dtd文件

wKiom1cPjB2hdvBCAABtiyIH23o564.png

<!ELEMENTfamily(father,mother,son+)>
<!ELEMENTfather(name,age)>
<!ELEMENTname(#PCDATA)>
<!ELEMENTage(#PCDATA)>
<!ELEMENTmother(name,age)>
<!ELEMENTson(name|wife|grandson)*>
<!ELEMENTwife(#PCDATA|name)*>
<!ELEMENTgrandson(name)>
<!ATTLISTsonstatusCDATA#required>

编写XML文件引用DTD文件family.dtd

wKiom1cPkbzinKnfAABUJPAfxvc325.png

wKiom1cPkqSgi2lJAAAo_g1x0ps355.png

wKioL1cPk3-QdoAEAAA9PlyFz7c626.png

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEfamilySYSTEM"file:///E:/Users/小爱爱/Desktop/family.dtd">
<family>
	<father>
		<name>张三</name>
<age>40</age>
	</father>
	<mother>
		<name>刘丽</name>
		<age>36</age>
	</mother>
	<sonstatus="bigson">
		<name>张天</name>
		<wife>
			<name>王华</name>
		</wife>
		<grandson>
			<name>张晓华</name>
		</grandson>
	</son>
	<sonstatus="smallson">
		<name>张帅</name>
	</son>
</family>

(2)内部DTD文件

新建一个内部有DTD文件的XML文件class.xml

wKiom1cPkmfweAkDAABb89CctMg019.png

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEclass[
<!ELEMENTclass(student*)>
<!ELEMENTstudent(name,age,sex)>
<!ELEMENTname(#PCDATA)>
<!ELEMENTage(#PCDATA)>
<!ELEMENTsex(#PCDATA)>
<!ATTLISTclassclassIdID#required>
<!ATTLISTstudentstuIdIDREF#IMPLIED>
]>
<classclassId="a01">
	<studentstuId="a01">
		<name>张三</name>
		<age>18</age>
		<sex>男</sex>
	</student>
	<studentstuId="a01">
		<name>李四</name>
		<age>18</age>
		<sex>女</sex>
	</student>
	<student>
		<name>王五</name>
		<age>17</age>
		<sex>女</sex>
	</student>
</class>

由以上的XML文件可以看出

#IMPLIED:表示该属性可以有也可以没有。

#required:表示该属性必须有。

还有一种属性的特征

#FIXED:表示该属性属性值固定。

被声明为IDREF属性类型的属性值必须引用ID属性类型的属性值。

(3)ANY的用法规则

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEcompany[
<!ELEMENTcompanyANY>
<!ELEMENTworker(name,sex,age)>
<!ELEMENTname(#PCDATA)>
<!ELEMENTsex(#PCDATA)>
<!ELEMENTage(#PCDATA)>
<!ATTLISTworkerworkIdID#required>
]>
<company>
	<workerworkId="a10">
		<name>zhangsan</name>
		<sex>nv</sex>
		<age>28</age>
	</worker>
	<company></company>
	<name>lisi</name>
	<age>30</age>
	<name>wangwu</name>
	<sex>nan</sex>
</company>

ANY类型表示可以包含多个子元素且不受限制,也可包含字符串数据。但ANY一般用在对根元素的声明中。

(4)NMTOKEN和NMTOKENS

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEstudent[
<!ELEMENTstudent(#PCDATA)>
<!ATTLISTstudentstuIdNMTOKEN#required>
<!ATTLISTstudentclassIdNMTOKENS#required>
]>
<studentstuId="a10"classId="a10"></student>

以上代码可以通过编译,当XML为以下代码时会出现下图的错误信息

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEstudent[
<!ELEMENTstudent(#PCDATA)>
<!ATTLISTstudentstuIdNMTOKEN#required>
<!ATTLISTstudentclassIdNMTOKENS#required>
]>
<studentstuId="a10"classId="a10"></student>

wKiom1cPnqCSXSWqAAAeZfWcAIA422.png

NMTOKEN类型要求属性值中不能包含空格且必须以下划线、数字或字母开头。

NMTOKENS类型与NMTOKEN类型类似,NMTOKENS类型要求属性值必须以下划线、数字或字母开头。但可以包含空格。

(5)枚举类型

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEpeople[
<!ELEMENTpeople(person+)>
<!ELEMENTperson(#PCDATA)>
<!ATTLISTperson性别(男|女)#IMPLIED>
<!ATTLISTperson学历(高中|大学|研究生|博士)#IMPLIED>
	]>
<people>
	<person性别="女"学历="大学">lily</person>
	<person></person>
</people>

列举出要选的项,与下拉列表类似。

wKiom1cPodbTdqjkAAAmN8LgV1s867.png

猜你在找的XML相关文章