科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道XML数据的底层结构之DTD

XML数据的底层结构之DTD

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

XML数据的底层结构之DTD

作者:chinaunix 来源:chinaunix 2007年10月4日

关键字: 技术 XML 中间件 应用

  • 评论
  • 分享微博
  • 分享邮件
1.文档类型定义DTD(Document Type Definition)是XML结构文件的一种定义方式;
2.DTD定义了可用在文档中的元素,属性,和实体,以及它们之间的相互关系;
3.DTD在建立XML文档中的作用
说说建立一个XML文档的主要步骤:
(1).命名相关的信息项,把其映射为相应的元素或属性.
(2).确定XML文档的层次结构,即各元素之间的嵌套关系
(3).根据层次结构构造DTD;
(4).根据DTD编写相应的XML文档
 
4.DTD的语法:
<1>.元素定义
      (1).元素声明
         形式:  <!ELEMENT name content >
         说明:其中name为XML标记的名字,content 为EMPTY,ANY,描述子元素的顺序和重复次数的内容 模型
      (2).元素内容的类型
       a). EMPTY 类型   :只有属性没有字符数据或子元素
       b). ANY 类型       : 包含DTD定义的所有其他元素或已编译的字符数据
       c). #PCDATA 类型:不包含其他子元素而只包含字符数据的元素
       d). 子元素类型     :包含一系列的子元素,子元素的内容模型用于指定某个元素可以包含哪些子元素,其结构有两种:序列和选择
       e).混合类型         :既包含子元素又包含已编译的字符数据
      (3).元素出现次数的指示符
      "?"    元素可以出现0次或者1次;
      “*”    元素可以不出现,或者出现一次或多次
      "+"   元素必须出现至少一次,或者可以说出现一到多次
<2>.属性定义
      (1).属性声明
       语法: <! ATTLIST Element_name Attribute_name Type Default_value >
       说明:ATTLIST 用于定义元素所具有的属性,
        Element_name 是元素名;
        Attribute_name 是该元素所具有的属性;
        Type 是属性的类型
         Default_value 是属性的默认值
       (2).属性的类型
       a).   CDATA 类型:  此属性的值只能是文本类型
       b).   枚举属性类型: 指定的文本串列表中的某个文本串;
       c).   ID属性类型:   用于标识文档中的元素;
       d).   IDREF /IDREFS 类型: 用于引用同一文档中的另一元素的ID属性
       e).   NMTOKEN/NMTOKENS 属性类型: 必需为一个有效的XML名称;
       f).    ENTITY 和ENTITYS 属性类型: 用来引用文档中的不可解析的外部实体;
       g).   NOTATION 类型
              用于把属性值和DTD中的<! NOTATION>声明关联起来
        (3).属性的默认值
       a).   REQUIRED : 表示这个元素在使用时必须具有该属性;
       b).   IMPLIED :    该属性不是必须使用的;
       c).   FIXED   :     在相应的XML文档中可以不用明确的指定该属性的值,如果明确指定属性值,则必须是定义时给出的默认值
 
xml应用举例:

    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次,而爱好可以没有,也可以有好几方面的,所以用*(任意次)限定。

选择性元素 用"|"限定,如 <!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 唯一的数字
IDREF ID类型属性的值
IDREFS 由空格分开的若干个ID
ENTITY 实体
ENTITYS 若干个实体
NMTOKEN XML名称
NOTATION DTD中声明的注释名
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属性;
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章