欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XML文档类型定义(DTD)

程序员文章站 2022-05-30 12:29:39
...

1.DTD的作用

XML文档是一种元标记语言,即一种定义标记语言的语言。在XML中可以创建新的标记语言,这些新的标记语言(也叫标记集)要通过文档类型定义(Document Type Definitions,DTD)来定义。

DTD文档是这些新的标记语言的法律性文档。如果XML文档的语法符合DTD的定义和规定,那么就称为一个合法的XML文档,否则就是非法的XML文档。

2.DTD元素

DTD中描述的基本部件是元素和属性,它们负责确定XML文档的逻辑结构。
元素表示一个信息对象,而属性表示这个对象的性质。所有元素中有且只有一个根元素,其他的元素都是它的子元素,除根元素外,每个元素都被其他元素包含,一个元素可以有几个不同类型的子元素。

1)元素的基本类型

1.简单型

      “#PCDATA”(Parsed Character Data)表示标记的内容是可解析文本,所谓的可解析文本就是非标记文本用“#PCDATA”规范了的元素不能再包含子元素。

例如:

How do you do 是不包含标记的文本,而How do you <list>do</list>就不是可解析的数据类型,因为其中包含有标记<list>和</list>。

另外DTD文档中不同元素定义的次序没有先后关系,但文档的语法对大小写敏感
         “#PCDATA”的声明格式:

<!ELEMENT Element_Name (#PCDATA )>
2.复合型

<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
		<title>计算机导论</title>
		<author>丁跃潮等</author>
		<publish>
			<publisher>高等教育出版社</publisher>
			<ISBN>7-04-014768-8</ISBN>
			<pubdate>2004.6</pubdate>
		</publish>
		<price>19.7</price>
</bookinfo>
2)元素的声明

1. 元素声明的基本语法

   元素的声明格式:
   <!ELEMENT Element_Name Element_Defination>
   其中,Element_Name为声明的元素名称,Element_Defination为元素内容格式的定义。
   合法的元素声明语句如:

<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT publisher (#PCDATA)>
2. 空元素的声明

   声明格式:

<!ELEMENT Element_Name EMPTY>
 <!ELEMENT hr EMPTY>
3. 不限定元素内容的声明

ANY是DTD中使用很频繁的一个关键字,特别是对于文档根元素的声明。在定义一个DTD文档时通常很难准确地确定

一个元素是否具有子元素的情况,此时一般的做法是指定该元素的子元素为ANY型(表示可以是任意的元素),这样在

它之中可以包含任何数据、任何声明的子元素及其数据和子元素的组合。

  ANY元素的声明格式:

<!ELEMENT Element_Name ANY>
<!ELEMENT person ANY>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ANY>
<!ELEMENT title ANY>
<!ELEMENT author ANY>
<!ELEMENT publisher ANY>
<!ELEMENT price ANY>
]>
<bookinfo>
		<title>计算机导论</title>
		<author>丁跃潮等</author>
		<publisher>高等教育出版社</publisher>
		<publisher>高等教育出版社</publisher>
		<price>19.7</price>
		<price>19.7</price>
		<a>a</a>
</bookinfo>

ANY型的元素在文档中应尽量少使用,因为这与XML文档的数据结构性相违背。但多数情况之下在定义一个元素的所有子元素之前,总是首先以ANY代替,最后再以实际的子元素替代ANY关键字,定义出具体的DTD文档。

4. 子元素列表的设定

在XML中有一种针对复合元素的最为严格的设定方法,称为子元素列表的设定。这种方式下,元素都拥有哪些

子元素、每个子元素出现的次数和位置都有明确的规定,在具体文档实现时,必须严格执行。

子元素列表的设定语法如下:

<!ELEMENT Element_Name(Child_Element1, Child_Element2,…)>
5. 可选择的子元素

    有些时候,需要在两个或多个互斥的元素中进行选择。即多选一的情况,如一个人的性别可以是男或女,两者

中只能有一种情况。DTD有专门的语法来处理这种情况,语法格式如下:

<!ELEMENT Element_Name(Child_Element1|Child_Element2|……)>
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher|ISBN|pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
		<title>计算机导论</title>
		<author>丁跃潮等</author>
		<publish>
			<publisher>高等教育出版社</publisher>
		</publish>
		<price>19.7</price>
</bookinfo>
6. 元素出现次数的控制

(1) 一个元素可能出现一次,也可能不出现。这时可通过在元素名后面加上一个“?”来实现。
(2) 一个元素可能不出现,也可能出现多次。这时可通过在元素名后面加上一个“*”来实现。
(3) 一个元素可能出现一次,也可能出现多次,但至少也要出现一次。这时可通过在元素名后面加上一个“+”来实现。

7. 元素组

在声明复合型元素的时候,可以使用括号将其部分子元素组合在一起,成为一个元素组,该元素组在特性上与普

元素没什么区别,可以对其使用“?”、“*”、“+”等控制字符。在实际应用中,使用元素组可能不是最好的方案。这时

也可以先将准备分组的元素定义为一个复合元素,再在原来的元素中引用刚定义的复合元素,这样文档的结构更清晰 。

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo [
	<!ELEMENT maininfo (title, author, price)>
	<!ELEMENT bookinfo (booknumb, maininfo+)>
	<!ELEMENT booknumb (#PCDATA)>
	<!ELEMENT title (#PCDATA)>
	<!ELEMENT author (#PCDATA)>
	<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
	<booknumb>2</booknumb>
	<maininfo>
		<title>计算机导论</title>
		<author>丁跃潮等</author>
		<price>19.7</price>
	</maininfo>
	<maininfo>
		<title>三国演义</title>
		<author>罗贯中</author>
		<price>50.0</price>
	</maininfo>
</bookinfo>
8. 混合型元素

其内容既可以为字符数据,也可以为子元素,这种元素称为混合型元素。混合型元素的声明格式:

<!ELEMENT Element_Name(#PCDATA|Child_Element1| Child_Element2,…)>

混合型元素的存在破坏了文档的层次结构化,不利于应用软件对XML文档的处理,在XML文档开发过程中,它可以

作为一个不成熟的DTD文档,一步一步地在XML文档中添加元素,边添加边测试其正确性,这时可将尚未处理的部

分作为字符数据组织到一个混合型元素中,以便使文档通过测试。但在文档最后完成时,要通过添加新元素的方法

来清除这种非结构化信息。

3.DTD属性

    简单来讲就是元素的附加特性,在DTD中声明元素时,也必须对该元素的属性进行声明。

1.属性的声明

属性的声明格式:

<!ATTLIST Element_name Attribute_name TYPE Default_value>
其中,<!ATTLIST>为属性声明的关键字,Element_name为元素名,Attribute_name为属性名,TYPE是属性类型,

Default_value为没有设定属性值时的默认值。

在声明属性时有以下需要注意的事项。

(1) 可以多次为一个元素声明其中所包含的属性。如在XML文档中有如下语句:

<bookinfo id="001" bookcategory="文艺" >
</bookinfo>

属性声明可以为

<!ATTLIST bookinfo id CDATA "001">
<!ATTLIST bookinfo bookcategory CDATA "文艺" >
<!ELEMENT bookinfo (#PCDATA)>

(2) 属性的声明在文档中的次序没有严格的要求,可位于与其相连的元素声明之前或之后。如

<bookinfo id="001" bookcategory="文艺" >
</bookinfo>

属性声明可以为

<!ATTLIST bookinfo bookcategory CDATA "文艺" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>

(3) 所有元素的属性,都要在各自所对应的标记中声明。

(4) 属性有4种不同类型的默认值,可在属性声明中的Default_value部分指定。

default:表示使用提供的默认值,default不是一个关键字,它代表一个预设的字符串

<!ATTLIST bookinfo bookcategory("文艺"|"自然科学")"文艺" >

上面表示当在XML文档中省略了对bookinfo元素的bookcategory属性值进行设定时,该属性的默认值就是“文艺”。

#REQUIRED:表示属性值必须指定。

<!ATTLIST bookInfo ISBN CDATA #REQUIRED >
对应的bookInfo的ISBN属性必须指定属性值

<bookInfo ISBN="7-04-014768-8">
</bookInfo>

#IMPLIED:表示元素的这个属性可用可不用。

#FIXED:表示元素的这个属性值是一个固定值,且必须是指定的值。

2.属性的类型

    在属性的声明中TYPE部分为属性的类型设定,DTD中属性的类型有10种:

CDATA型、 Enumerated型、ID型、IDREF与IDREFS型、ENTITY与ENTITIES型、NMTOKEN与NMTOKENS型、NOTATION型

1. CDATA

    CDATA型表明属性值为不包含“<”和“"”的任意字符串,如果属性值中需要包含“<”和“"”,则可使用特殊

字符来代替。

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 单引号
&quot; " 引号

在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

2. Enumerated型

形式为:name (en1|en2|..)

<!ATTLIST title name (name1|name2) #REQUIRED>
<title name="name1">计算机导论</title>
上面title中的name属性必须要在name1和name2中选择一个

3. ID

当元素的某个属性值是不能重复时,如书籍的ISBN属性、个人的“身份证号”属性等,要定义这样的属性则需使用

属性的ID类型。在一个XML文档中,所有元素的ID类型属性的属性值必须是唯一的,不可重复,另外,一个元素不

能有超过一个ID类型的属性

<!ATTLIST author id ID #REQUIRED>
<author id="author1">丁跃潮</author>
<author id="author2">张涛</author>
相同类型的元素的id不能一样

4. IDREFIDREFS

IDREFIdentifier Reference的缩写,IDREFID类型属性的关系为子元素与父元素的关系,即IDREF类型属性的值必须

是其他元素的ID类型属性的值,且该ID类型属性的值必须在文档的其他地方被设定过。IDREFS类型属性的属性值可有

多个,每一个都必须是在文档其他地方被设定了的ID类型属性的值,而这多个属性值之间用空格隔开。

<!ATTLIST teacher teach IDREFS #REQUIRED>
<!ATTLIST author id ID #REQUIRED>
<teacher teach="c001 c002 c003"></teacher>
<author id="c001">丁跃潮</author>
<author id="c002">张涛</author>
<author id="c003">张涛</author>
IDREF和IDREFS是和ID配合连用的

5. ENTITYENTITIES

ENTITY类型的属性提供了把外部二进制形式的文件(.jpeg.mp3)和外部不可解析实体链接到XML文档的功能。因

此其属性值也必须为不可解析的链接外部实际数据的通用实体名。ENTITIES类型属性的属性值可由多个不可解析的外

部实体名称组成,各实体名称之间使用空格隔开。

<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<picture pic="pic1"/>

6. NMTOKENNMTOKENS

NMTOKEN类型的属性限定属性值是有效的XML名称,这个属性值可以由英文、数字、“.”、 “_”、“-”、“:”等组成,以下几点需要注意。

(1) 不能包括空格。

(2) 以上字符中除“:”以外,其他字符都可以作为开头字符。

(3) :”可以出现在中间,但由于它是命名域的关键字符,所以一般不提倡使用。

正因为NMTOKEN类型的属性对于字符的严格要求,使得它在一些常用编程语言中,都是合法的数据,这就为这些编程语言对XML文档数据的操作打下了良好的基础。

NMTOKENS类型属性具有与NMTOKEN属性相近的形式。这种类型的属性可以使如下情况合法——属性由若干XML组成,彼此间由空格隔。通常可为使用NMTOKEN属性相同的理由而使用NMTOKENS属性,但仅仅在需要多个名字的时候。

7. NOTATION

XML文档中引入了外部不可解析的实体后,解析器无法解析这些二进制文件,这时,就可以使用NOTATION类型的属性为这些二进制文件指定与其对应的应用软件以对其进行处理。

<!NOTATION mspaint SYSTEM "C:\WINDOWS\system32\mspaint.exe">
<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED>
<!ATTLIST picture procedure NOTATION #REQUIRED>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<!ENTITY pic3 SYSTEM "c.jpg">
<!ENTITY pic4 SYSTEM "d.jpg">
<picture pic="pic1 pic2" procedure="mspaint"/>



















相关标签: xml 文档 DTD