DTD语法概述及简单应用举例

来源:互联网 发布:成都华育国际网络推广 编辑:程序博客网 时间:2024/05/17 03:12

XML作为一门标记语言,它就需要一种文档(即文档类型定义DTD)来定义,DTD可以看作是一类XML文档的模板。它定义了文档的逻辑结构,规定了XML文档中所使用的元素,实体,元素的属性,元素与实体之间的关系。它使得数据交流与共享得以正常进行,验证了数据的有效性。DTD可以是一个完全独立的文件,也可以在XML文件中直接设定。所以,DTD分为外部DTD(在XML文件中调用另外已经编辑好的DTD)和内部DTD(在XML文件中直接设定DTD)两种。在一些有相互业务往来的公司,如果他们使用的电子文档是XML文档,那么我们就可以定用一个独立的DTD文档。每次交换和定义时都引用它来验证结构完整性和语法的合法性。比如以下一个XML文档:

<?xml version ="1.0" encoding ="GB2312" standalone="yes" ?>
<学生名单>
    
<学生>
      
<学号>2003081205</学号>
      
<姓名>田淋</姓名>
      
<班级>计03.2班</班级>
    
</学生>
    
<学生>
      
<学号>2003081232</学号>
      
<姓名>杨雪锋</姓名>
      
<班级>计03.2班</班级>
    
</学生>
</学生名单>

它的一个DTD文档如下:

 1<?xml version="1.0" encoding="GB2312" standalone="yes"?>
 2<!DOCTYPE学生名单[
 3<!ELMENT 学号 (#PCDATA)>
 4<!ELMENT 姓名 (#PCDATA)>
 5<!ELMENT 班级 (#PCDATA)>
 6<!ELMENT 学生 (学号,姓名,班级)>
 7<!ELMENT 学生名单 (学生,学生)>
 8]>
 9
10
11

2为DTD定义开始标记,学生名单为其根元素,3到7都是元素定义 ,8是结束标记。下面将介绍一下元素声明的语法及注意事项。

元素声明
格式:<!ELMENT 元素名称 元素的内容格式的定义>
(1)基本元素声明:<!ELMENT 学号 (#PCDATA)>    元素名称后直接跟的是数据类型则为基本元素。
(2)复合元素声明:<!ELMENT 学生 (学号,姓名,班级)> 学生元素是复合元素,它包含学号,姓名,班级三个基本元素。其实根元素是复合元素的一个特例,所有的元素都直接或间接地包含在根元素中。

元素出现次数的控制

加"?"表示些元素可出现0次或1次;加"*"表示可出现任意次;加"+"表示至少要出现一次。如:<!ELMENT 学生 (学号?,姓名,班级,爱好*)>则表示一个学生只有唯一的学号,或者还未分配学号,即学号元素出现0次或1次,而爱好可以没有,也可以有好几方面的,所以用*(任意次)限定。


一点补充:

DTD中类似<!ELMENT 学生 (学号,姓名,班级)>这种定义的顺序是固定的。想要不固定顺序可以<!ELMENT 学生 (学号|姓名|班级)*>,但是你可以看到,这样的话就不能控制出现次数。所以才有了Schema的出现。


选择性元素 用"|"限定,如 <!ELMENT 学生(姓名,性别,(优秀|良好|中等))>

属性声明
格式:<!ATTLIST Eltment_name Attribute_name Type [Keyword] [Default_value]> 
!ATTLIST 为定义属性的指令,后面是元素的名称,属性名称,属性值类型及默认值的关键字及默认值。
如一个学生有性别及班级两个属性,可这样定义:<!ATTLIST  学生 性别 CDATA "女" 班级 CDATA "计算机03.2班">
必需赋值的属性:加REQUIRED关键字,如:<!ATTLIST  学生 性别 CDATA #REQUIRED "女" 班级 CDATA "计算机03.2班"> 表示必需给出学生的性别值。可有可无的属性则用IMPLIED关键字,固定取值的属性用FIXED关键字。
属性的类型:在XML中共有10种属性类型,如下表:

类型含义CDATA字符数据Enumerated可能的取值的列表ID唯一的数字IDREFID类型属性的值IDREFS由空格分开的若干个IDENTITY实体ENTITYS若干个实体NMTOKENXML名称NOTATIONDTD中声明的注释名NMTOKENS多个XML名称 

 

例子:

XML文件代码:
<?xml version="1.0"?>
<!DOCTYPE message[
<!ELEMENT message (header,body,(signature|footer))>
<!ELEMENT header (date,from,to+,subject,banner?)>
<!ELEMENT body  (paragraph*)>
<!ELEMENT date  (date,month,year)>
<!ELEMENT paragraph (#PCDATA)>
<!ATTLIST paragraph size CDATA #REQUIRED>
<!ELEMENT signature (#PCDATA)>
<!ELEMENT footer  ANY>
<!ELEMENT day    (#PCDATA)>
<!ELEMENT month    (#PCDATA)>
<!ATTLIST month type (numberic|character) #REQUIRED>
<!ELEMENT year    (#PCDATA)>
<!ATTLIST year    format (numeric|character) "numeric" >
<!ELEMENT from  (#PCDATA)>
<!ELEMENT to (#PCDATA)>
<!ATTLIST to relationship CDATA #IMPLIED>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT banner   (#PCDATA)>
]>
<message >
 <header>
  <date>
   <day>12</day>
   <month type="character">MAY</month>
   <year>2006</year>
  </date>
  <from> luliuyan </from>
  <to>   luliuyan's wife</to>
  <to relationship="very close">Your family</to>
  <to relationship="not so close">Your friends</to>
  <subject> Merry Christmas</subject>
  <banner></banner>
 </header>
 <body>
  <paragraph size="1 line">
  Best wishes for Christmas 
  </paragraph>
  <paragraph size="2 line">
  I love you!! 
  </paragraph>
 </body>
 <footer>
  <day>Christmas Day</day>
  <from>The best for us</from>
 </footer>
</message> 
 
 
分析:
看XML文件最重要的是要看它的结构:
从上面的示例我们可以知道,第一层次:message包含三个元素:header,body,signature或者footer(其中一个);
第二层次:
header又包含五个子元素:date,from,to("+"表示to元素出现次数为一到多次),subject,banner("?"表示banner元素出现次数为零到多次);
body有子元素paragraph("*"表示paragraph元素可以不出现,或出现一次或多次),而且paragraph有#PCDATA限制,表示不能包含其它元素,且只能是字符数据,另外paragraph含有属性size, 且size属性的类型是CDATA,表示是字符数据,#REQUIRED表示使用paragraph元素时必须使用size属性;
signature元素  也为字符类型;
footer元素类型为任意类型ANY;(本例中是包含其它子元素的类型);
 
第三层次:
date元素又包含day,month(有type属性),year(有format属性)三个子元素;
from元素;
to元素有relationship属性;
0 0
原创粉丝点击