XML 3 —— DTD

  • 有效的(valid)XML文档。首先XML文档是个格式正规的XML 文档,然后有需要满足DTD的要求,这样的XML文档称为有效的XML文档。
  • #PCDATA (Parsed Character Data),可解析的字符数据。
  • 关于普通实体与参数实体
    • 普通实体是在dtd中定义,xml中使用,使用的时候格式为,&address;
    • 参数实体是在dtd中定义,dtd中使用,定义的时候使用%,使用的时候也需要使用%,%address;
    • 外部普通实体的定义方式是:<!ENTITY address SYSTEM "http://www.shengsiyuan.com/xml.xml"> 表示使用http://www.shengsiyuan.com/xml.xml网址的内容来替换掉address ,而不是使用http://www.shengsiyuan.com/xml.xml_字符串本身来替换掉address。
    • 外部参数实体:,<!ENTITY % address SYSTEM "http://www.shengsiyuan.com/xml.xml">,使用的时候: %address;

文档类型定义——(Document Type Definition)

DTD用来描述XML文档的结构,一个DTD文档包含

  • 元素(ELEMENT)的定义规则
  • 元素之间的关系规则
  • 属性(ATTLIST)的定义规则
  • 可使用的实体(ENTITY)或符号(NOTATION)规则

什么是DTD、为什么要用DTD

  • DTD文档与XML文档实例的关系
    • 类与对象
    • 数据库表结构与数据记录
  • 有了DTD,每个XML文件可以携带一个自身格式的描述
  • 有了DTD,不同组织的人可以使用一个通用DTD用来交换数据
  • 应用程序可以使用一个标准DTD校验从外部世界接受来的XML数据是否有效
  • 可以使用DTD校验自己的XML数据

如何生成一个DTD文档

  • DTD文档的声明和引用
    • 内部DTD文档
      • <!DOCTYPE 根元素 [定义内容]>
    • 外部DTD文档
      • <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
    • 内外部DTD文档结合
      • <!DOCTYPE 根元素 SYSTEM "DTD文件路径"[定义内容]>
  • poem.xml
    • <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE poem SYSTEM "dtd_1.dtd">
      <poem>
          <author>王维</author>
          <title>鹿柴</title>
          <content>空山不见人</content>
      </poem>
  • dtd_1.dtd

    • <?xml version="1.0" encoding="UTF-8"?>
      <!ELEMENT ENTER_NAME_OF_ROOT_ELEMENT_HERE EMPTY>
      <!ELEMENT poem (author+, title*, content?)>
      <!ELEMENT author (#PCDATA)>
      <!ELEMENT title (#PCDATA)>
      <!ELEMENT content (#PCDATA)>

元素的定义 

语法

<!ELEMENT NAME CONTENT>
  • ELEMENT 关键字
  • NAME 元素名称
  • CONTENT 元素类型
    • EMPTY 元素不能包含子元素和文本,但可以有属性 ——(空元素)
      • <!-- EMPTY示例——空元素 -->
        <!ELEMENT 人 EMPTY>
        <家庭>
            <人 名字="匹诺曹" 性别="男" 年龄="6"/>
        </家庭>
        
        <!-- 错误示例 -->
        <家庭>
            <>匹诺曹</>
            <><大人>匹诺曹爸爸</大人></>
        </家庭>
    • ANY 元素可以包含任何在DTD中定义的元素内容,如果将根元素设置为ANY类型后,元素出现次数和顺序将不受限制。
      • <!-- ANY示例 -->
        <!ELEMENT 人 ANY>
        <家庭>
            <>匹诺曹</>
            <><大人>匹诺曹爸爸</大人></>
        </家庭>
    • #PCDATA 可以包含任何字符数据,但是不能再其中包含任何子元素
      • <!-- #PCDATA示例 -->
        <!ELEMENT 人 (#PCDATA)>
        <家庭>
            <人 性别="男" 年龄="6">匹诺曹</>
        </家庭>
        
        <!-- 错误示例 -->
        <家庭>
            <><大人>匹诺曹爸爸</大人></>
        </家庭>
    • 纯元素类型 置包含子元素,并且这些子元素外没有文本
    • 混合类型 包含子元素和文本数据的混合体
      • <!-- 组合类型示例 -->
        <!ELEMENT家庭(人+, 家电*)>
        <家庭>
            <人 名字="郭大路" 性别="男" 年龄="25"/>
            <人 名字="李寻欢" 性别="男" 年龄="38" 爱好="作个教育家和伟人"/>
            <家电 名称="彩电" 数量="3"/>
        </家庭>

 修饰符号

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

属性的定义

  • 语法
    • <!ATTLIST /元素名称
          属性名称 类型 属性特点
          ......
      >
  • 类型
    • CDATA
      • 属性值可以是任何字符(包括数字和中文)
      • <!ATTLIST 木偶 
            姓名 CDATA #REQUIRED
        >
        <!ATTLIST 木偶 姓名="匹诺曹"/>
        <!ATTLIST 木偶 姓名="PiNuoCao"/>
        <!ATTLIST 木偶 姓名="123"/> 
      • 注意这里CDATA与CDATA节的区别,#PCDATA与CDATA的区别
    • ID
      • 表明 该属性的取值必须是唯一的
      • <!ELEMENT 公司职员 ANY>
        <!ATTLIST 公司职员
            编号 ID #REQUIRED
            姓名 CDATA #REQUIRED
        >
        
        <!-- 正确示例 -->
        <公司职员 编号="Z001" 姓名="张三"/>
        <公司职员 编号="Z002" 姓名="李四"/>
    • 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="儿子"/>
        </家庭>
    • NMTOKEN/NMTOKENS
      • NMTOKEN是CDATA的一个子集,表示属性值必须是英文字母、数字、句号、破折号、下划线或冒号,属性值不能含有空格。
      • NMTOKENS与NMEOKEN类似,包含多个由空格分隔的字符。
      • <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE poem[
            <!ELEMENT ENTER_NAME_OF_ROOT_ELEMENT_HERE EMPTY>
            <!ELEMENT poem (title, content)>
            <!ELEMENT title (#PCDATA)>
            <!ELEMENT content (#PCDATA)>
            <!ATTLIST title author NMTOKEN #REQUIRED>
        ]>
        <poem>
            <title author="wangwei">鹿柴</title>
            <content>空山不见人</content>
        </poem>
    • Enumerated
      • 事先定义好一些值,属性的值必须在所列出的值的范围内
      • <!ATTLIST person
            婚姻状态(single|married|divorced|widowed) #IMPLIED>
        <!ATTLIST person 性别(男|女) #REQUIRED>
    • ENTITY/ENTITIES
    • NOTATION
    • NOTATIONS
  • 属性特点
    • #REQUIRED
      • 元素的所有实例都必须有该属性的值(not null)
      • 语法
        • <!ATTLIST 元素名 属性名 属性类型 #REQUIRED>
      • 示例
        • <!ATTLIST person number CDATA #REQUIRED>
          <person number="5677" />
    • #IMPLIED
      • 元素的实例中可以忽略该属性(null)
      • 语法
        • <!ATTLIST 元素名 属性名 属性类型 #IMPLIED>
      • 示例
        • <!ATTLIST contact fax CDATA #IMPLIED>
          <person number="555-667788" />
    • FIXED value
      • 元素实例中该属性的值必须为指定的固定值
      • 语法
        • <!ATTLIST 元素名 属性名 属性类型 #FIXED"value">
      • 示例
        • <!ATTLIST sender company CDATA #FIXED"Microsoft">
          <sender company="Microsoft"/>
    • Default value
      • 为属性提供一个默认的值
      • 语法
        • <!ATTLIST 元素名 属性名 属性类型 "value">
      • 示例
        • <!ATTLIST hello payment type CDATA "check">
          <hello payment="check"/>

 实体

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

实体类型

实体类型有普通实体、外部实体、参数实体、外部参数实体

类型 普通实体 参数实体
使用场合 用在XML文档中 只用在DTD中元素和属性的声明中
声明方式 内部 <!ENTITY  实体名 "文本内容"> <!ENTITY % 实体名 "文本内容">
外部 <!ENTITY  实体名 SYSTEM "外部文件URL地址"> <!ENTITY  % 实体名 SYSTEM "外部文件URL地址">
引用方式 &实体名; %实体名
posted @ 2021-01-26 15:32  我等着你  阅读(123)  评论(0编辑  收藏  举报