分享

DTD简介

 昵称46195383 2017-08-08

是W3C的一个文档类型定义规则文件,是用来让浏览器根据你定义的DTD(文档类型定义)来解释页面代码的。 

doctype声明指出阅读程序应该用什么规则集来解释文档中的标记。在Web文档的情况下,“阅读程序”通常是浏览器或者校验器这样的一个程序,“规则”则是W3C所发布的一个文档类型定义(DTD)中包含的规则。 

每个DTD都包括一系列标记、attributes和properties,它们用于标记Web文档的内容;此外还包括一些规则,它们规定了哪些 标记能出现在其他哪些标记中。每个Web建议标准(比如HTML 4 Frameset和XHTML 1.0 Transitional)都有自己的DTD。 


假如文档中的标记不遵循doctype声明所指定的DTD,这个文档除了不能通过代码校验之外,还有可能无法在浏览器中正确显示。对于标记不一致的问题,浏览器相较于校验器来说更宽容。但是,不正确的doctype声明经常导致网页不正确显示,或者导致它们根本不能显示。


一个DTD文档实际上就是元素定义的集合,而元素可能包含属性,也可能不包含属性。

1. <!-- 一个ELEMENT的示例。ELEMENT定义语法:
    <!ELEMENT ITEM SUBITEM | ITEMTYPE>

ITEM:元素名称;
        SUBITEM:子元素的组合(SUBITEM1,SUBITEM2)
                          子元素的语法
                        ()    :给内容分组    (Sub11|Sub12|Sub13),(Sub21|Sub22), Sub3
                           |       :选择其中的某一元素
                           ,    :依次按相同顺序出现
                          +       :一次或多次
                          ?     :0次或一次
                          *      :任意次
          ITEMTYPE 可以为如下类型:
                          EMPTY   :    不能包含数据元素,以<Example />方式出现                         
                          ANY        :    任何本身有效的元素内容
                         #PCDATA:    任何字符数据,不能包含子元素    
-->

<!ELEMENT Employee (Name,ID,Department,Project*)>

2.<!-- ATTLIST是一个XML语言的保留字,也可以称为是关键字。一个元素ELEMENT 可以包含多个属性,一个属性有三部分构成:属性名称(AttributeName)、属性类型(Type)和属性特点(Default)。 ElementName表示元素的名称,元素的名称相当于程序设计语言中变量的名称,你可以任意取。AttributeName表示属性的名字,你可以任意取名,比如身高、体重、性别等等。Type表明该属性的类型,就象在C++中我们对一个变量需要指定它的类型(比如int,double,bool等等)。Default表明这个属性的特点,在XML语言中,可以有四种形式:#REQUIRED,#IMPLIED,#FIXED value,defaultvalue。一个属性定义的例子。
    语法:
    <! ATTLIST ElementName
               AttributeName Type Default
               AttributeName Type Default
               …
 >

    类型                    具体的含义说明 
    CDATA                这个类型表明该属性只能包含字符数据,比如"Lucent","CDMA","老板"等等 
    ID                         该属性的取值必须是唯一的,就象我们每个人都有的身份证号码一样。在一个文档内 ID属性的值必须唯一。 
    IDREF,IDREFS     这个属性的值引用一个文档中其他地方声明的ID值。如果具体的文档中该属性的取值和它所指向的ID值不匹配的话,就会返回错误。IDREFS和IDREF类似,但是可以具有由空格分隔的多个引用。 
    ENTITY,ENTITIES ENTITY属性的值必须对应一个在文档内部声明的但还没有分析过的实体。ENTITIES属性和ENTITY类似,不同的是它可以包含多个实体,每一个 实体之间可以用空格进行分隔。需要注意的是实体包括普通实体、外部实体、参数实体和外部参数实体。一般来说,你可以把实体理解为类似C++中的一个定义, 比如在C++中,我们定义一个变量: const MYCOMPANYNAME="BigSoft"以后你就可以在程序中使用变量MYCOMPANYNAME。这里可以把MYCOMPANYNAME当成一 个实体来理解。 
    NMTOKEN,NMTOKENS NMTOKEN和CDATA非常类似,不同之处在于它是CDATA的一个子集。它所使用的字符必须是字母、数字、句点、破折号、下划线或冒号。NMTOKENS和NMTOKEN类似,不同之处在于它可以包含多个值,每个值之间用空格进行分隔 
    NOTATION         NOTATION属性的值必须引用在文档中其他地方声明的某个注解的名称 
    NOTATION(enumerated) 该属性的值必须匹配NOTATION名称列表中的某个名称,比如我们已经存在两个NOTATION,一个为beauty,一个为beast。我们可以定义一个属性类型为NOTATION(beauty|beast)
     
    Enumerated      这个几乎和C++中的枚举变量一样,我们事先定义好一些值,该属性的值必须匹配所列出的这些值。该属性的类型就可以表现为定义的枚举值,枚举值之间用"|"进行分隔。 
        
    Default 的四种选择
    #REQUIRED     用来告诉XML解析程序,该元素的所有实例都必须有该属性的值。就象数据表中某一个字段不允许为空一样。 假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词 #REQUIRED。
    #IMPLIED         表示如果该元素的实例中没有指定该元素的值的话,就忽略该属性。就象在数据表中某一个字段的值可以为NULL一样。假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。 

   #FIXED value   表示包含该属性的元素实例必须指定所列出的值,比如一个属性名称为美女:美女 CDATA #FIXED "我的老婆"表示如果在实例中没有列出这个属性的话,解析器依然认为存在美女这个属性,它的值就是"我的老婆"。一般的应用是设计这个属性用来说明这些文 档都是由一个DTD来实例化产生的。 如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用 #FIXED 关键词。如果作者使用了不同的值,XML 解析器会返回错误。
     Defaultvalue   为属性提供一个默认的值。比如一个属性名称为美女:美女 CDATA "我的老婆"如果在该属性的实例中没有包含这个属性的话,解析器就认为该属性的值就是"我的老婆",如果在该属性的实例中包含了这个属性并赋值了的话,就采用这个赋值。     
-->
<!ATTLIST Employee 
             nickname          CDATA      #REQUIRED    
             HRID                  ID             #REQUIRED  
             married          CDATA      #IMPLIED
>
<!ELEMENT Employee (Name,IdentificationID,Department,Task)>
<!ATTLIST Employee 
             nickname          CDATA      #REQUIRED    
             HRID                  ID             #REQUIRED  
             married          CDATA      #IMPLIED
>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT IdentificationID (#PCDATA)>
<!ELEMENT Department (DName,Team,Floor)>
<!ELEMENT DName (#PCDATA)>
<!ELEMENT Team (#PCDATA)>
<!ELEMENT Floor (#PCDATA)>
<!ELEMENT Task (Project*)>
<!ELEMENT Project (description)>
<!ATTLIST Task 
             taksId           ID        #REQUIRED
             TaskName CDATA    #REQUIRED
             PreTaskId    IDREF    #IMPLIED>
<!ELEMENT description (#PCDATA)>

对于上面的DTD文件中的Task的Type为IDREF,这个表明该属性的值必须在文档中出现过。如果该属性的值没在文档中出现过的话,该文档就属于不规范文档,解析器就不会认为该文档是有效的。
如果下面XML文档: 
<Project>  
       <PERSON taskId="T_1" TaskName="P_1">
  <PERSON taskId="T_2" TaskName="P_2">
  <PERSON taskId="T_4" PreTaskId="T_1 T_5" TaskName="P_3">
</Project>
文档中PreTaskId的T_5在文档中没有出现过,则该文档问不规范文档

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多