DTD XML约束文档

   文档类型定义(DTD)可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用 。

   

1.内部声明文档

       <?xml version="1.0"?>

       <!DOCTYPE note [

         <!ELEMENT note (to,from,heading,body)>

         <!ELEMENT to      (#PCDATA)>

         <!ELEMENT from    (#PCDATA)>

         <!ELEMENT heading (#PCDATA)>

         <!ELEMENT body    (#PCDATA)>

       ]>

       <note>

         <to>George</to>

         <from>John</from>

         <heading>Reminder</heading>

         <body>Don't forget the meeting!</body>

       </note>


    以上 DTD 解释如下:

      !DOCTYPE note (第二行)定义此文档是 note 类型的文档。

      !ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"

      !ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型

      !ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型

      !ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型

      !ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型


2.外部文档声明

       <?xml version="1.0"?>

       <!DOCTYPE note SYSTEM "note.dtd">

       <note>

       <to>George</to>

       <from>John</from>

       <heading>Reminder</heading>

       <body>Don't forget the meeting!</body>

       </note> 


     这是包含 DTD 的 "note.dtd" 文件:

       <!ELEMENT note (to,from,heading,body)>

       <!ELEMENT to (#PCDATA)>

       <!ELEMENT from (#PCDATA)>

       <!ELEMENT heading (#PCDATA)>

       <!ELEMENT body (#PCDATA)



3.XML 文档构建模块

       3.1 元素

       3.2 属性

       3.3 实体

       3.4 PCDATA

             PCDATA 的意思是被解析的字符数据(parsed character data)。

             可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

             PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

             文本中的标签会被当作标记来处理,而实体会被展开。

             不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;、              &lt; 以及 &gt; 实体来分别替换它们。

       3.5 CDATA  

             CDATA 的意思是字符数据(character data)。

             CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对                待,其中的实体也不会被展开。


4.DTD文档结构

    4.1 元素

        <!ELEMENT 元素名称 类别>

        <!ELEMENT 元素名称 (元素内容)>

      4.1.1 空元素

         <!ELEMENT 元素名称 EMPTY>

      4.1.2  PCDATA 的元素

          <!ELEMENT 元素名称 (#PCDATA)>

      4.1.3 带有任何内容的元素    

          <!ELEMENT 元素名称 ANY>

      4.1.4 带有子元素(序列)的元素

          <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

      4.1.5 声明只出现一次的元素

          <!ELEMENT 元素名称 (子元素名称)>

      4.1.6 声明最少出现一次的元素

          <!ELEMENT 元素名称 (子元素名称+)>

      4.1.7 声明出现零次或多次的元素

          <!ELEMENT 元素名称 (子元素名称*)>

      4.1.8 声明出现零次或一次的元素

          <!ELEMENT 元素名称 (子元素名称?)>

      4.1.9 声明“非.../既...”类型的内容

           <!ELEMENT note (to,from,header,(message|body))>

      4.1.10 声明混合型的内容

           <!ELEMENT note (#PCDATA|to|from|header|message)*>

    

    4.2  属性:属性通过 ATTLIST 声明来进行声明。

       4.2.1 语法

           <!ATTLIST 元素名称 属性名称 属性类型 默认值>

       4.2.2 以下是属性类型的选项:

           CDATA 值为字符数据 (character data)

           (en1|en2|..)  此值是枚举列表中的一个值

           ID  值为唯一的 id

           IDREF 值为另外一个元素的 id

           IDREFS  值为其他 id 的列表

           NMTOKEN 值为合法的 XML 名称

           NMTOKENS  值为合法的 XML 名称的列表

           ENTITY  值是一个实体

           ENTITIES  值是一个实体列表

           NOTATION  此值是符号的名称

           xml:  值是一个预定义的 XML 值

       4.2.3 默认值参数可使用下列值:

           值 属性的默认值

           #REQUIRED 属性值是必需的

           #IMPLIED  属性不是必需的

           #FIXED value  属性值是固定的

   4.3 实体

      4.3.1 语法

           内部实体声明 : <!ENTITY 实体名称 "实体的值">

           外部实体声明 : <!ENTITY 实体名称 SYSTEM "URI/URL">



   4.4 实例


      <!DOCTYPE TVSCHEDULE [

         <!ELEMENT TVSCHEDULE (CHANNEL+)>

         <!ELEMENT CHANNEL (BANNER,DAY+)>

         <!ELEMENT BANNER (#PCDATA)>

         <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>

         <!ELEMENT HOLIDAY (#PCDATA)>

         <!ELEMENT DATE (#PCDATA)>

         <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>

         <!ELEMENT TIME (#PCDATA)>

         <!ELEMENT TITLE (#PCDATA)> 

         <!ELEMENT DESCRIPTION (#PCDATA)>

         

         <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>

         <!ATTLIST CHANNEL CHAN CDATA #REQUIRED>

         <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>

         <!ATTLIST TITLE RATING CDATA #IMPLIED>

         <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>

       ]>