• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
安安的BLOG
安安目前专注电子商务解决方案^_^
博客园    首页    新随笔    联系   管理    订阅  订阅

第二章 文档类型定义和命名空间

本章目标
    理解文档类型定义
    DTD声明
    元素声明
    属性声明
    实体声明
    命名空间

什么是DTD、为什么要用DTD
    文档类型定义--Document Type Definition
    DTD用来描述XML文档的结构,一个DTD文档包含:
            元素(ELEMENT)的定义规则
            元素之间的关系规则
            属性(ATTLIST)的定义规则
            可使用的实体(ENTITY)或符号(NOTATION)规则
    DTD文档与XML文档实例的关系
            类与对象
            数据库表结构与数据记录
    有了DTD,每个XML文件可以携带一个自身格式的描述。
    有了DTD,不同组织的人可以使用一个通用DTD用来交换数据
    应用程序可以使用一个标准DTD校验从外部世界接受来的XML数据是否有效
    可以使用DTD校验自己的XML数据

如何生成一个DTD文档

一。DTD文档的声明及引用
        内部DTD文档    <!DOCTYPE 根元素  [定义内容]>
        外部DTD文档    <!DOCTYPE 根元素  SYSTEM "DTD文件路径">
        内外部DTD文档结合  <!DOCTYPE 根元素  SYSTEM "DTD文件路径" [定义内容]>
二。一个实例


注意:例中的定义关键字一定要大写,如DOCTYPE、ELEMENT、#PCDATA,且元素名称与数据类型之间也要有空格。



元素

一。语法
        <!ELEMENT NAME CONTENT>
        关键字   元素名称  元素类型
二。元素类型
        EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素)
        ANY-该元素可以包含任何在DTD中定义的元素内容
        #PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素
        纯元素类型--只包含子元素,并且这些子元素外没有文本
        混合类型--包含子元素和文本数据的混合体
三。EMPTY示例--空元素  
        <!ELEMENT 人 EMPTY>
        <家庭>
             <人 名字="皮诺曹" 性别="男" 年龄="6"/>
        </家庭>


        <家庭>
             <人>皮诺曹</人>
             <人><大人>皮诺曹爸爸</大人></人>
        </家庭>
        (错误)
四。ANY示例
        <!ELEMENT 人 ANY>
        <家庭>
             <人>皮诺曹</人>
             <人><大人>皮诺曹爸爸</大人></人>
        </家庭>
           
将根元素设为ANY类型后,元素出现的次数和顺序不受限制。
五。#PCDATA示例
        <!ELEMENT 人 (#PCDATA)>
        <家庭>
             <人 性别="男" 年龄="6">皮诺曹</人>
        </家庭>

         <家庭>
             <人><大人>皮诺曹爸爸</大人></人>
         </家庭>
         (错误)

六。组合类型示例
        <!ELEMENT 家庭 (人+, 家电*)>
        <家庭>
                 <人 名字="郭大路" 性别="男" 年龄="25"/>
                 <人 名字="李寻欢" 性别="男" 年龄="38" 爱好="作个教育家和伟人"/>
                 <家电 名称="彩电" 数量="3"/>
        </家庭>

修饰符号 
 

符号
用途
示例
示例说明
(  )
用来给元素分组
(古龙|金庸|梁羽生),(王朔|余杰),毛毛
分成三组
|
在列出的对象中选择一个
(男人|女人)
表示男人或者女人必须出现,两者至少选一
+
该对象最少出现一次,可以出现多次 (1或多次)
(成员+)
表示成员必须出现,而且可以出现多个成员
*
该对象允许出现零次到任意多次(0到多次)
(爱好*)
爱好可以出现零次到多次
?
该对象可以出现,但只能出现一次 (0到1次)
(菜鸟?)
菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次
,
对象必须按指定的顺序出现
(西瓜,苹果,香蕉)
表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现


属性

一。语法
        <!ATTLIST 元素名称
        属性名称    类型    属性特点
         …...
        >
二。属性的类型
        CDATA
        ID
        IDREF / IDREFS
        NMTOKEN / NMTOKENS
        Enumerated
        ENTITY / ENTITIES
        NOTATION
        NOTATION(enumerated) 

    1.属性类型- CDATA
        属性值可以是任何字符(包括数字和中文)
        <!ATTLIST 木偶
            姓名 CDATA   #REQUIRED
        >  

        <木偶 姓名="皮诺曹"/>
        <木偶 姓名="Pi Luocao"/>
        <木偶 姓名="123"/>


        请注意这里的CDATA与第一章CDATA的区别
         #PCDATA与CDATA的区别
   2.属性类型-NMTOKEN / NMTOKENS
        NMTOKEN是CDATA 的一个子集,表示属性值必须是英文字母、数字、句号、破折号、下划线或冒号(不能是中文!)。
        NMTOKENS与NMTOKEN类似,包含多个由空格分隔的字符。 
        <?xml version="1.0" encoding="gb2312" ?>
        <!DOCTYPE poems[
        <!ELEMENT poems (title,content)>
        <!ELEMENT title (#PCDATA)>
        <!ATTLIST title author NMTOKEN #REQUIRED>
        <!ELEMENT content (#PCDATA)>
        ]>
        <poems> 
            <title author="dupu">八阵图</title>
        <content>
                功盖三分国,名成八阵图,
                江流石不转,遗恨失吞吴.
        </content> 
        </poems>


        <poems> 
            <title author="杜甫">八阵图</title>
        <content>
              功盖三分国,名成八阵图,
              江流石不转,遗恨失吞吴.
        </content> 
        </poems>
        (错误)

  3. 属性类型- ID
        表明该属性的取值必须是唯一的。   ID属性值必须是合格的XML名字
        <!ELEMENT 公司职员 ANY>
        <!ATTLIST 公司职员
            编号 ID #REQUIRED
            姓名 CDATA #REQUIRED
        >

        <公司职员 编号="Z001" 姓名="张三"/>
        <公司职员 编号="Z002" 姓名="李四"/>

        <公司职员 编号="Z001" 姓名="张三"/>
        <公司职员 编号="Z001" 姓名="李四"/>
        (错误)

   4. 属性类型- IDREF / IDREFS 
        IDREF属性的值指向文档中其它地方声明的ID类型的值。 
        IDREFS同IDREF,但是可以具有由空格分开的多个引用。 
        <!ELEMENT 家庭 (人+)> 
        <!ELEMENT 人 EMPTY> 
        <!ATTLIST 人 
            relID ID #REQUIRED 
            parentID IDREFS #IMPLIED 
            name CDATA #REQUIRED 
        >

        <家庭> 
            <人 relID="P_1" name="爸爸"/> 
            <人 relID="P_2" name="妈妈"/> 
            <人 relID="P_3" parentID="P_1 P_2" name="儿子"> 
        </家庭> 
                                                            空格
    5. 属性类型-Enumerated
        事先定义好一些值,属性的值必须在所列出的值的范围内。
        <!ATTLIST person 
                 婚姻状态 (single|married|divorced|widowed) #IMPLIED>
        <!ATTLIST persion 性别 (男|女) #REQUIRED>

   6. 属性类型ENTITY / ENTITIES
        ENITITY类型的属性的值必须对应一个在DTD文档内声明的实体。通常用来处理外部的二进制数据文件,如图形、音效等
        ENTITIES类型的属性的值与ENITITIES类似,不同的是可以包含多个由空格分开的实体。
        <?xml version="1.0" encoding="gb2312"?>
        <!DOCTYPE library[
         <!ELEMENT library (number,img)>
         <!ELEMENT number (#PCDATA)>
         <!ELEMENT img EMPTY>
         <!ATTLIST img src ENTITIES #REQUIRED> 
         <!ENTITY pic SYSTEM "pic1.gif">
          ]>
          <library> 
             <number> A001 </number>
             <img src="&pic;"/>
           </library>

    7. 属性类型-NOTATION
        属性的值必须引用已在DTD文档其它地方声明过的某个注解的名称。
        <!NOTATION mpeg SYSTEM "mplayer.exe">
        <!ATTLIST media  
         player NOTATION  (mpeg)  #REQUIRED>

附注:定义符号NOTATION

        Notation主要是用来表明文档中需要来自外部源的数据,而该数据XML本身是不能进行解析的,比如各种格式的二进制文件(比如图形文件、声音文件等),需要外部的应用程序进行处理。

        Notation声明的语法格式为:       <!NOTATION NAME ExternalID>

        需要注意的是NAME必须由字母、数字、句点、破折号或冒号组成,并且第一个字符必须为字母或者是下划线。

        下面的例子表示GIF图象作为不解析的外部内容。
       <!NOTATION gif system "iexplore.exe">
       <!ENTITY logo SYSTEM "http://somewebsite/somecategory/something.gif" NDATA gif>
       <!-- 这里NDATA表示XML不解析该数据 -->
       <!ELEMENT PIC EMPTY>
       <!ATTLIST PIC
           loc ENTITY #REQUIRED
       >
       然后,在具体的实例化文档中包含下面一行代码:<PIC loc="&logo;" />
根据DTD定义,loc属性值是一个不解析的实体。解析器可以根据DTD定义知道这一点,然后它就不对其进行解析,也不会象解析实体一样把它包括到XML文档里面。同时,XML解析器将通知iexplore.exe该引用的存在。

 8.  属性类型-NOTATION(enumerated)
            属性的值必须匹配NOTATION名称列表中的某个名称。
            <!NOTATION mpeg SYSTEM "mplayer.exe">
            <!NOTATION jpeg SYSTEM "netscape.exe">
            <!ATTLIST media  
                     player NOTATION  ( mpeg | jpeg ) #REQUIRED>

三。属性特点
        #REQUIRED
        #IMPLIED
        #FIXED value
        Default value 

    1. 属性的特点-#REQUIRED
        元素的所有实例都必须有该属性的值(NOT NULL)
        语法:
                <!ATTLIST 元素名 属性名 属性类型 #REQUIRED>
        DTD 示例: 
                <!ATTLIST person number CDATA  #REQUIRED> 
        XML 示例: 
                <person number="5677" />
    2. 属性的特点-#IMPLIED
        元素的实例中可以忽略该属性(NULL)。
        语法:
                <!ATTLIST 元素名 属性名 属性类型  #IMPLIED>
        DTD示例:
                <!ATTLIST contact fax CDATA #IMPLIED>
        XML示例:
                <contact fax="555-667788" /> 
     3.属性的特点-#FIXED value
        元素实例中该属性的值必须为指定的固定值。
        语法:
                <!ATTLIST 元素名 属性名 类型  #FIXED "value">
        DTD示例:
                <!ATTLIST sender company CDATA  #FIXED "Microsoft"> 
        XML示例:
                <sender company="Microsoft" /> 
    4. 属性的特点-Default value
        为属性提供一个默认的值
        语法:
                <!ATTLIST 元素名 属性名 类型 "value">
        DTD示例:
                <!ATTLIST payment type CDATA "check"> 
        XML示例:
                <payment type="check" />

实体
一。定义实体
    内部实体
        语法:
              <!ENTITY 实体名 "实体值">
        DTD 示例:
            <!ENTITY writer "Donald Duck.">
            <!ENTITY copyright "Copyright W3Schools.">
        XML 示例:
            <author>&writer;&copyright;</author> 
  外部实体
        语法:
                <!ENTITY 实体名 SYSTEM "URI/URL">
        DTD 示例:
                <!ENTITY writer SYSTEM "http://www.w3schools.com/entities/entities.xml">
                 <!ENTITY copyright SYSTEM "http://www.w3schools.com/entities/entities.dtd">
        XML 示例:
                <author>&writer;&copyright;</author>
二。

posted @ 2005-12-09 17:39  安安  阅读(823)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3