×

DTD

96
小明滚出去_
2017.12.18 11:13 字数 852

一、声明

  • 内部DOCTYPE
<!DOCTYPE 根元素 [元素声明]>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
  • 外部DOCTYPE
<!DOCTYPE 根元素 SYSTEM "文件URI">
<!DOCTYPE 根元素 PUBLIC "文件名" "文件URI">

二、XML结构

  • 元素
  • 属性
  • 实体
    &lt;  &gt;  &amp;  &quot;  &apos;
    
  • PCDATA(默认)
  • CDATA

三、DTD元素声明

  • 指定类别
    <!ELEMENT 元素名称 类别>
    
     <!ELEMENT br EMPTY>
     <!ELEMENT note ANY>
    
  • 指定内容
    <!ELEMENT 元素名称 (元素内容)>
    <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>  有序
    <!ELEMENT 元素名称 (子元素名称 1|子元素名称 2|.....)+> 无序
    
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT note (to,from,heading,body)>
    
    且字段可以按正则定义:
    <!ELEMENT note (message+)>至少一次
    <!ELEMENT note (message*)>零次或多次
    <!ELEMENT note (message?)>零次或一次
    <!ELEMENT note (to,from,header,(message|body))>或关系
    
    在声明元素有子元素序列时需要按顺序声明子元素,子元素也遵循这个规则。
  • 混合内容(不推荐)
    <!ELEMENT 元素名称 (#PCDATA | 子元素1 | 子元素2 ...)*>
    
    这里的'|'不代表'或'关系,表示这些元素可以无序出现任意多次,如:
    <!DOCTYPE root [
      <!ELEMENT root (#PCDATA | a | b )* >
      <!ELEMENT a (#PCDATA | c | d)* >
      <!ELEMENT c (#PCDATA)>
      <!ELEMENT d (#PCDATA)>
      <!ELEMENT b (#PCDATA)>
    ]>
    <root>
      <b>bbbbb11111</b>
      this is some datas
      <a>
        this is aaaaaaaaaa
        <c>ccccccc</c>
        <c>ccccccc22222</c>
        <d>dddddddd</d>
      </a>
      <b>bbbbbb</b>
      <b>bbbbb2222</b>
    </root>
    

四、DTD属性声明

  • 语法
     <!ATTLIST 元素名称 属性名称 属性类型 默认值>
    
    默认属性约束是IMPLIED,需指定默认值
  • 属性类型
    CDATA —— 字符串
    (en1|en2|..) —— 枚举
    ID —— 主键id,表示该属性为唯一值
    IDREF —— 关联元素的id
    IDREFS —— 关联多个元素的id,以空格分割
    NMTOKEN —— 元素标识,比id宽松,比CDATA严格,类似CSS中的class?
    NMTOKENS —— 多个元素标识
    ENTITY —— 未解析实体
    ENTITIES —— 未解析实体列表,多个以空格分割
    NOTATION —— 属性值只能是符号名
    xml:
    
  • 默认值
    value
    #REQUIRED —— 必须值
    #IMPLIED —— 非必须值
    #FIXED value —— 固定值
    
  • 当为元素定义属性类型为ENTITY\ENTITIES时,属性值只能是未解析实体:
    先定义符号:
    <!NOTATION pdf PUBLIC "PDF" "E:/Adobe Reader.exe" >
    在定义未解析实体:
    <!ENTITY book SYSTEM "book.pdf" NDATA pdf>
    最后定义元素和属性:
    <!ELEMENT ebookstore (#PCDATA)>
    <!ATTLIST ebookstore content ENTITY "book">
    

五、DTD实体声明

  • 普通实体,只能XML文档用
    <!ENTITY 实体名 "实体值">
    XML文档中使用:  &实体名;
    
  • 参数实体,只能DTD使用,且必须先定义后使用
    <!ENTITY % 实体名 "实体值">
    DTD中使用: %实体名;
    
  • 外部实体,XML使用
    <!ENTITY 实体名 SYSTEM "uri">
    <!ENTITY 实体名 PUBLIC "name" "uri">
    
  • 外部参数实体,DTD使用
    <!ENTITY % 实体名 SYSTEM "uri">
    <!ENTITY % 实体名 PUBLIC "name" "uri">
    
  • 未解析实体
    定义外部实体时,如果uri引用的文件不是文本文件或者不符合xml规范,则需要将该实体定义为未解析实体
    <!ENTITY % 实体名 SYSTEM "uri" NDATA 符号名>
    <!ENTITY % 实体名 PUBLIC "name" "uri" NDATA 符号名>
    
    符号名必须先定义后使用

六、DTD符号声明

<!NOTATION 符号名 SYSTEM "value">
<!NOTATION 符号名 PUBLIC "id" "value">
Java
Web note ad 1