DTD的定义、规则和编写
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明⽂章 、作者信息和本声明。否则将追究法律责任。
DTD ⽂档类型定义 (Documnet Type Definition)是⼀套关于标记符的语法规则。它是XML1.0版规格得⼀部分,是XML⽂件的验证机制,属于XML⽂件组成的⼀部分。 DTD 是⼀种保证XML⽂档格式正确的有效⽅法,可以通过⽐较XML⽂档和DTD⽂件来看⽂档是否符合规范,元素和标签使⽤是否正确。⼀个DTD⽂档包含:元素的定义规则,元素间关系的定义规则,元素可使⽤的属性,可使⽤的实体或符号规则。本⽂详述DTD的定义、规则和编写。
author: ZJ 07-2-28 Blog:swear
found的过去式1.DTD - XML 建⽴主组件群(blocks)像<body>....</body>之类的标签是XML和HTML⽂件的主组件群(blocks)。
1.1XML⽂件的组件群从DTD来看,所有的XML⽂件(和HTML⽂件)都是由接下来的简单组件群组成的:Elements元素;Attributes 属性;Entities实体;PCDATA 被解析的字符数据(Pard Character Data);CDATA 字符数据值(Character Data)。下⾯是每个组件群的简短解释。
1.2元素(Elements)元素是XML和HTML⽂件的主组件群(。元素
可以包括⽂本、其它元素或者空值。空值html元素的实例是"hr", "br" 和"img"。
between</message>
1.3属性(Attributes)属性提供关于元素的额外信息(extra information about elements)。属性总是置于元素的开始标签⾥⾯。属性⼀般是以“名称(name)/值(value)”这样的形势⼀对对的出现。下⾯的“img”元素就是关于源⽂件的补充信息: <img src="computer.gif" /> 元素名称是“img”。属性名称“src”。属性值是"computer.gif"。因为元素⾃⾝是空值,所以它是以“/”结束的。
1.4实体(Entities)实体是对于定义普通⽂件(define common text)的变量。实体参数是定义实体的参数。很多⼈都知道HTML实体参数:" "。这⾥的"no-breaking-space" 实体是在HTML中⽤来在⽂本中插⼊⼀个额外空间的。当XML剖析器解析⽂件时,实体就会得到扩展。下⾯(表1)的实体是在XML中预定的:表 1
字符字符实体
&&;或&breakin
'&apos;或'
>>;或>
<<;或<
"";或"
1.5 PCDATA PCDATA的意思是被解析的字符数据。把字符数据当作XML元素的开始标签与结束标签之间的⽂本。剖析器会分析PCDATA⽂本。⽂本中的标签会被当作标⽰的字体,实体将会扩展。
1.6 CDATA CDATA也是字符数据的意思。剖析器不会解析CDATA⽂本。⽂本中的标签不会作为标⽰字体,实体也将不会得到扩展。
2.元素定义 2.1元素声明元素声明语法如下: <!ELEMENT name content> 其中,name是⼀个标准的XML标记的名字。Centent由以下三种之⼀组成:①关键字EMPTY;②关键字ANY;③描述包含在本元素中的⼦元素的顺序和重复次数的内容模型。
bataclan
2.2元素内容类型(Element Content Model)元素内容通常有五种类型:EMPTY、ANY、#PCDATA、⼦元素型和混合型。
2.2.1 EMPTY类型 EMPTY⽤于定义空元素,该元素只可能有属性⽽不会有字符数据或⼦元素。其形式为<swt/>或<swt></swt>。声明空元素的语法如下:
<!ELEMENT emptyelement EMPTY>
2.2.2 ANY类型该元素可以包含DTD中定义的其他任何元素或已编译的字符数据。声明该元素的语法如下: <!ELEMENT anyelement ANY>
2.2.3 #PCDATA类型不包含其它任何元素⽽只包含字符数据的元素,⽤关键字#PCDATA进⾏定义,它代表“已编译的字符数据(pard character data)”。PCDATA可以包含除标记以外的⼀切字符,包括数字、字母和符号等。被定义为包含PCDATA的元素不能包含任何其它⼦元素。⽰例如下: <!ELEMENT title(#PCDATA)>
2.2.4 ⼦元素类型元素可以包含⼀系列的⼦元素,⼦元素内容模型⽤于指定某个元素可以包含哪些⼦元素,如: <!ELEMENT
message(header,body,signature,footer)>//message元素包含四个⼦元素,依次是header、body、signature和footer元素。根据⼦元素间的关系,⼦元素内容模型可以有两种可能的结构:序列和选择。①序列。其所有⼦元素必须出现且仅出现⼀次,这种结果成为序列。使⽤序列时应注意,⾸先,
序列中不能出现#PCDATA;其次,⼦元素⾃⾝还可以包含其它⼦元素。②选择。元素间的选择可以进⾏如下声明: <!ELEMENT elem(subelem1|subelem2|subelem3)>//将⼦元素⽤竖线进⾏分隔,表明elem元素的⼦元素为subelem1、subelem2和subelem3三者之⼀,但不能同时包含其中的两个或三个⼦元素。序列和选择这两种结构可以结合使⽤。
2.2.5 混合类型若某元素既包含⼦元素⼜包含已编译的字符数据,则该元素具有混合内容。其声明如下: <!ELEMENT pick(#PCDATA|one|two|three)*> 为避免产⽣错误,混合内容元素的声明必须遵循这⼀格式。即采⽤单⼀的⼀组可选项,以#PCDATA开始,后⾯是混合内容中可能出现的⼦元素类型,每种只需声明⼀次。除此之外,“*”必须放在右括号之后。下⾯的声明是错误的: <!ELEMENT pick(one|#PCDATA|two*|three)>
3.属性定义 3.1属性声明属性声明的语法如下: <!ATTLIST Element_name Attribute_name Type De
hunter hayesfualt_value> 其中,ATTLIST关键字⽤来定义元素所具有的属性,Element_name是元素名,Attribute_name是该元素所具有的属性名,Type是属性的类型,Defualt_value是属性的默认值。注意:在⼀个给定的元素中不能有两个属性同名;若属性值中含有双撇号,则该属性值应⽤单撇号括起来。如: <job comments=’He said,”I can paint only red door” ’>Door Painter</job>
表 3
属性值类别描述
CDATA属性值仅仅是⼀般的⽂字。与#PCDATA元素声明类似。
<!ATTLIST AnElem attr CDATA #REQUIRED>
Enumerated列出该属性的取值范围,⼀次只能有⼀个属性值能够赋予属性。
<!ATTLIST play position (center|forward|defen) ”center”>
NMTOKEN表⽰属性值只能由字母或下划线_开始,之后是字母、数字、下划线、短横线或圆点,且不能含有空格。NMTOKENS表⽰属性值能够由多个nmtoken组成,每个nmtoken之间⽤空格隔开。
ID ID类型⽤于标识⽂档中的元素。该属性在xml⽂件中是唯⼀的。同时,每个元素最多只能具有⼀个ID类型的属性。
<!ALLTIST author authorID ID #REQUIRED >
IDREF/ IDREFS IDREF表⽰该属性值是参考了另⼀个id属性;IDREFS表⽰该属性值是参考了多个id属性,这些id属性的值⽤空格隔开。
DTD定义:
<!ELEMENT bookInfo(publishers,authors,books)>
<!ELEMENT publishers(publisher+)>
<!ELEMENT publisher(pname,address)>
<!ATTLIST publisher publisherID ID #REQUIRED>
kapok
<!ELEMENT pname(#PCDATA)>
<!ELEMENT address(#PCDATA)>
<!ELEMENT authors(author+)>
<!ELEMENT author(aname,age,x)>
<!ATTLIST author authorID ID #REQUIRED>
<!ELEMENT aname(#PCDATA)>
<!ELEMENT age(#PCDATA)>
<!ELEMENT x(#PCDATA)>
<!ELEMENT books(book*)>
<!ELEMENT book(title,price,year)>
<!ATTLIST book publisher IDREF #REQUIRED
author IDREFS #REQUIRED>
<!ELEMENT title(#PCDATA)>
<!ELEMENT price(#PCDATA)>
<!ELEMENT year(#PCDATA)>
对应的XML⽂档:
<bookInfo>
<publishers>
<publisher publisherID=”p001”>
<pname>tsinghua university press</pname>
<address>Beijing</address>
</publisher>
<publisher publisherID=”p002”>
<pname>electronic industy press</pname>
<address>Beijing</address>
</publisher>
</publishers>
<authors>
全身快速美白
<author authorID=”a001”>
<aname>Mary</aname>
<age>34</age>
<x>male</x>
</author>
<author authored=”a002”>
<aname>Tom</aname>
<age>39</age>
<x>female</x>
上海韩语培训
</author>
</authors>
<books>
<book publisher=”p001” author=”a001 a002”>
<title>XML</title>
<price>22</price>
<year>2007</year>
<year>2007</year>
</book>
gripe
</books>
</bookInfo>
ENTITY表⽰该属性的设定值是⼀个外部实体(entity),如⼀个图⽚⽂件。
ENTITYS该属性值包含了多个外部entity,不同的entity之间⽤空格隔开。
NOTATION属性值是在DTD中声明过的notation(声明⽤什么应⽤软件解读某些⼆进制⽂件,如图⽚)。
<!NOTATION gif SYSTEM “GIF_Viewer”>
<!NOTATION jpg SYSTEM “JPG_Viewer”>
<!NOTATION png SYSTEM “PNG_Viewer”>
<!ELEMENT img (#PCDATA)>
<!ATTLIST img src CDATA #REQUIRED
NOTATION(png|jpg|gif)#REQUIRED >
//其中,type属性的值可以为png、jpg和gif之⼀,且每个值均与⼀个相应的<!NOTATION>声明相对应。
3.3 属性默认值属性声明可以给属性指定⼀个默认值,使得当在XML⽂档中未明确地指定该属性的值时,XML处理器会将此默认值作为该属性的值。属性的默认值可⽤#REQUIRED、#IMPLIED、#FIXED和字符串定义,见表4。
表4
属性内定值描述
#REQUIRED表⽰在标记中必须出现此属性。
#IMPLIED标记中可以不出现此属性。即该属性不是必须使⽤。
combo#FIXED属性的值是固定的某个值。
字符串标记中如没有指定属性的值,那么此字符串就是此属性的值。
属
名称的各个部分是:①名称以加号或减号开头。加号表⽰该DTD已经通过标准组织的批准。减号表⽰该DTD未经标准化。②//Big Dog//DTD表⽰编写和维护该DTD的个⼈或组织。③sustomer_support是对此DTD的描述,//EN//表⽰该DTD所⽤的语⾔,是英语。
代“&name;”。现在考虑实际上所发⽣的如下过程。①XML处理器看到实体引⽤&name;并寻找替换⽂本。②找到“Harry&Fred&Joe”,并替换
为“Harry&Fred&Joe”。③XML处理器插⼊替换⽂本,结果代码是: <text>The job was left to Harry&Fred&#amp;Joe.</text> ④然后处理器顺利的分
析“&”和“&#amp;”,得到: <text> The job was left to Harry&Fred&Joe</text>
体饮⽤,使它被⽂件的内容所替代。