XML系列:文档类型定义DTD

一,什么是DTD?
 1,XMl是一种元标记语言,是描叙语言的语言,定义标记的语法结构,从而生成新标记。而DTD则是为新标记建立文档并进行规范说明。
  也就是说XML定义标记的语法结构是通过DTD来定义,并指定文档结构的规范,而XML文档来使用标记。
 2,自描述数据的规范。
 
二,DTD的作用
 1,DTD定义了文档中的元素(标记和属性)和实体,以及相互关系。数据和结构分离。
 2,通过DTD验证XML文档的有效性。DTD为解析器提供了解析XML文档的依据。所以每个XML文档必须指定对于哪个DTD有效。

三,DTD的结构
 1,元素的声明:使用元素声明来声明XML文档中的元素

  ⑴,带有数据的元素:
   <! ELEMENT 元素名 (数据类型)>
   数据类型:
    #CDATA:指元素包含不通过解析器解析的字符数据。特殊字符和保留字不需要转义。
    #PCDATA:指元素包括解析器可解析字符数据。特殊字符和保留字需要转义才可以通过解析器。
    ANY:元素可以包含任何声明类型的子元素和字符数据。
  
  ⑵,带有子元素的元素:
   <! ELEMENT 元素名  (子元素1名,子元素2名)>
    多个子元素用逗号隔开。
    在文档中的顺序和定义中的顺序一致。
    子元素可以有自己的子元素。 
   
   ①相同元素只出现一次:
    <! ELEMENT 元素名 (子元素)>  
   ②相同元素至少出现一次:+
    <! ELEMENT 元素名 (子元素+)>  
   ③相同元素出现零次或多次:*
    <! ELEMENT 元素名  (子元素*)>
   ④相同元素出现零次或一次:?
    <! ELEMENT 元素名  (子元素?)>
  
  ⑶ ,空元素:
   <! ELEMENT 元素名 (EMPTY)>
    空元素可以有属性
   
  ⑷,混合声明
   组可以是序列或选择子元素和/或子组:
    ①序列
     <! ELEMENT A (B)> : 元素A由单个子元素B组成.
     <! ELEMENT A (B, C)> :元素A由子元素B和C组成.
     <! ELEMENT A (B, (C | D), E> :元素A由子元素B ,E和选择子组(C或D中之一)组成.
    ②选择 子元素和/或子组
     <! ELEMENT A (B | C)>:元素A由子元素选择子组(B或C)组成.
     <! ELEMENT A (B | C | (D, E))>:元素A由包括序列子组(D和E)的选择(B或C或D,E之一)组成.

 2,属性的声明   
  ⑴空属性
   <! ATTTLIST 元素名 EMPTY>
  ⑵非空属性
   <! ATTLIST 元素名  属性名  属性类型  属性值>
   属性值:
    ①,Default属性值:指定一个默认值
      <! ATTLIST 元素名  属性名  属性类型  "默认值" >
      DTD示例:
       <! ATTLIST  售价 货币单位 CDATA "人民币">
      XML示例:
       <售价  货币单位 = "人民币">10.90</售价>
    ②,Implied属性值:可以不提供该属性,该属性也没有默认值。
      <! ATTLIST 元素名  属性名  属性类型  #IMPLIED >
      DTD示例:
       <! ATTLIST  售价 货币单位 CDATA #IMPLIED>
      XML示例:
       <售价>10.90</售价>
       
    ③,Required属性值:必须提供该属性,但可以没有默认值。
      <! ATTLIST 元素名  属性名  属性类型  #REQUIRED >
      DTD示例:
       <! ATTLIST  售价 货币单位 CDATA  #REQUIRED>
      XML示例:
       <售价 货币单位 = "美元">10.90</售价> 
            
    ④,Fixed属性值:使属性具有固定值,不可以更改。
      <! ATTLIST 元素名  属性名  属性类型  #FIXED  "固定值">
      DTD示例:
       <! ATTLIST  售价 货币单位 CDATA #FIXED "人民币">
      XML示例:
       <售价  货币单位 = "人民币">10.90</售价>
    
    属性类型: 
    ①,Enumerated属性类型:使默认值成为一组固定值中之一。
      <! ATTLIST 元素名  属性名   (固定值A|固定值B|...)    默认固定值之一>
      DTD示例:
       <! ATTLIST  售价 货币单位   ("人民币"|"美元"|"欧元")  "人民币">
      XML示例:
       <售价  货币单位 = "欧元">10.90</售价> 
              
    ②,ID和IDREF属性类型
     1,ID:用于搜索某个元素的特定实例,每个元素都可以具有ID类型的属性
      <! ATTLIST 元素名  属性名  ID  属性值>
      DTD示例:
       <! ATTLIST  售价 支付方式 ID  #REQUIRED>
      XML示例:
       <售价  ID = "BOOK1">10.90</售价>
       <售价  ID = "BOOK2">10.90</售价>
       <售价  ID = "BOOK3">10.90</售价>        
     2,IDREF:指向一个元素,引用其他元素中的一个元素。
      <! ATTLIST 元素名  属性名  IDREF  属性值>
      DTD示例:
       <! ATTLIST  售价 货币单位 ID  #REQUIRED>
       <! ATTLIST  售价 货币单位 IDREF  #IMPLIED>
       <! ATTLIST  售价 货币单位  CDATA   #IMPLIED>
      XML示例:
       <售价  ID = "BOOK1"  货币单位 = "人民币">10.90</售价> 
       <售价  ID = "BOOK2" IDREF = "BOOK1"></售价>    
    ③,IDREFS属性类型
      指向多个元素ID,用空格分开。用于指向XML文档中的相关元素列表。
      <! ATTLIST 元素名  属性名  IDREFS  属性值>
      
四,使用DTD
 
 1,内部DTD
  XML声明后在XDOCTYPE声明中编写内部DTD。
  <! DOCTYPE 根元素名 [
   元素声明
   。。。
  ]>
 2,外部DTD
  编写DTD文件,扩展名为DTD,在XML文档DOCTYPE声明中添加DTD引用,告诉解析器外部DTD信息,
  <! DOCTYPE 根元素名  SYSTEM  "DTD文件名.dtd">
 
 3,DTD中的内部实体和外部实体和

  参见:XML系列:XML文档结构 中的实体;
  
 4,DTD中的参数实体
  先用内部DTD声明,把参数实体设置为元素名 ,在XML文件中引用 外部DTD验证。
  
  DTD文件
   ...
  <! ENTITY %实体名  "字符数据">
  <! ELEMENT  元素名  ( %实体名)>
  <! ELEMENT   %实体名  (子元素)>
   ...
  
  XML文件
   ...
  <! DOCTYPE 根元素名  SYSTEM  “DTD文件名.dtd”[
   <! ENTITY  %实体名  "替换实体名的元素名">
  ]>
   ...
 
 例子:不同元素的XML共同关联一个DTD文件 
  
  DTD文件
    ...
  <! ENTITY %element  "e">
  <! ELEMENT  root  ( %element)>
  <! ELEMENT   %element  (name,sex,。。。)>
   ...
 
  XML文件1
   ...
  <! DOCTYPE root  SYSTEM  “DTD文件名.dtd”[
   <! ENTITY  %element  "student">
  ]>
  <root>
   <student>
    <name>张三学生</name>
     ...
   <student>
  </root>
  
  XML文件2
   ...
  <! DOCTYPE root  SYSTEM  “DTD文件名.dtd”[
   <! ENTITY  %element  "teatcher">
  ]>
  <root>
   <teatcher>
    <name>王五老师</name>
     ...
   <teatcher>
  </root> 

你可能感兴趣的:(数据结构,C++,c,xml,C#)