用DTD约束XML详解及示例

时间:2023-03-10 01:22:57
用DTD约束XML详解及示例

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

dtd的三种引入方式
    (1)引入外部的dtd文件

<!DOCTYPE 根元素名称 SYSTEM "dtd路径">

    (2)使用内部的dtd文件

 <!DOCTYPE 根元素名称 [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>

    (3)使用外部的dtd文件(网络上的dtd文件)

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">

例如 struts2 框架配置文件 使用 外部的dtd文件

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

 使用dtd定义元素
            简单元素:没有子元素的元素  <!ELEMENT 元素名 约束>   如:<!ELEMENT name (#PCDATA)>
                   约束: (#PCDATA): 约束name是字符串类型
                     EMPTY : 元素为空(没有内容)
                  ANY:任意类型
                复杂元素:有子元素的元素  <!ELEMENT 元素名称 (子元素)>  如:<!ELEMENT person (name+,age?,sex*,school)>
             子元素后面的符号表示子元素出现的次数  + :表示一次或者多次
                                       ? :表示零次或者一次
                                       * :表示零次或者多次
                                   无 :子元素只能出现一次
                            子元素直接使用逗号进行隔开 ,表示元素出现的顺序
          子元素直接使用|隔开,表示元素只能出现其中的任意一个

使用dtd定义属性
        语法: <!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
          属性类型:CDATA: 字符串          如:<!ATTLIST  birthday  ATT  CDATA  #REQUIRED>
            枚举 : 表示只能在一定的范围内出现值,但是只能每次出现其中的一个 。如<!ATTLIST  age  ATT2  (AA|BB|CC)   #REQUIRED>
            ID: 值只能是字母或者下划线开头  <!ATTLIST name  ATT3  ID    #REQUIRED>
      属性的约束:   #REQUIRED:属性必须存在
             #IMPLIED:属性可有可无
                                    #FIXED: 表示一个固定值   <!ATTLIST  sex ATT4  CDATA  #FIXED  "ABC">
             直接值:不写属性,使用直接值,写了属性,使用设置那个值   <!ATTLIST school ATT5 CDATA "WWW">

实体的定义
        语法: <!ENTITY 实体名称 "实体的值">       如:<!ENTITY TEST "HAHAHEHE">
      使用实体: &实体名称;  比如 &TEST;(注:定义实体需要写在内部dtd里面,如果写在外部的dtd里面,有某些浏览器下,内容得不到
实例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name+,age?,sex*,school,birthday)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name ATT ID #REQUIRED >
<!ELEMENT age (#PCDATA)>
<!ATTLIST age ATT2 (AA|BB|CC) #REQUIRED >
<!ELEMENT sex (#PCDATA)>
<!ATTLIST sex ATT4 CDATA #FIXED "ABC" >
<!ELEMENT school (#PCDATA)>
<!ATTLIST school ATT5 CDATA "WWW">
<!ELEMENT birthday (#PCDATA)>
<!ATTLIST birthday ATT1 CDATA #IMPLIED >
<!ENTITY TEST "HAHAHEHE">
]>
<person>
<name ATT="A1">&TEST;</name>
<age ATT2="CC">20</age>
<sex ATT4="ABC">111</sex>
<school>1111</school>
<birthday>2015</birthday>
</person>

显示结果:
aaarticlea/png;base64,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" alt="" />