DTD约束文件(转)

在讲解DTD文件之前,我要说说一份合格的XML应该符合怎么样的规则?

  就我总结一下几点,大家看看就好了:

  1.一份XML有且仅有一个根元素。

  2.XML是严格区分大小写的,<book>元素和<Book>元素是不相同的。

  3.如果一个元素不需要子内容的话,它就是一个空元素,应写成:<元素名 />,就不要写成这样了:<元素名><元素名 />

  4.XML文档开头声明:

<?xml version="1.0" encoding="UTF-8"?> 

声明以"<?"开头,以"?>"结束,中间version属性是必须的,是指该文档遵守XML1.0的规范,encoding是XML进行解码的时候所用的字符集,注意是解码不是编码,默认是用utf-8,该属性是可选的,此外还可能接触到一个standalone,它指定的是是否引用其他资源,它的值只有yes跟no

  5.如果元素中有空白字符的话,XML会原样保留,而HTML会把多个删除成一个再输出

  6.XML预留了几种实体引用::&lt:代表着小于号,&gt;代表着大于号,&amp:代表and符号,&apos;代表英文的单引号,&quot;代表英文的双引号,通过这些内置的实体引用,可以避免文档符号的冲突,保持良好的文档规范。

  7.CDATA标记:在CDATA标记下,里面的内容都是当做字符串来处理,即使是合法的字符,也会当做字符来处理。

<?xml version="1.0" encoding="UTF-8"?>
<book>
    <describe>
        <![CDATA[
            <a>
                author:xujianguo
            </a>
        ]]>
    </describe>
</book>

  输出<a>xujianguo</a>

  8.注释格式:<!-- 注释内容 -->

 

  下面正式讲解一下DTD文件:

  DTD文件为什么存在?

  一份XML文件下来,如果你没有添加约束条件的话,你要怎么写就怎么写,很不规范,同时也意味着别人不熟悉你的XML文件的条件下也可以操作你的XML文件,而通过DTD约束文件,可以约束每个元素内部可以出现哪些子元素,可以支持什么属性,这个就是DTD存在的理由了。

  引入的DTD:

  方法一:内部DTD - 就是将DTD与XML数据定义放在同一个文档中,格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<! DOCTYPE 根元素名[
    元素描述
]>
XML文档主体部分

  由上面我们也可以看出一个引入DTD最开始的格式了:

<! DOCTYPE 根元素名[
    元素描述
]>

  方法二:外部DTD - 就是将外部DTD的地址告诉XML,所以在XML中要说明一下地址在哪里。格式:<! DOCTYPE 根元素名 SYSTEM "外部DTD的URI">

现在假设在自己XML文档的相同路径下有个book.dtd文件,就可以这样引入:

<?xml version="1.0" encoding="UTF-8"?>
<! DOCTYPE book SYSTEM "book.dtd">
<book>
    <describe>
        <![CDATA[
            <a>
                author:xujianguo
            </a>
        ]]>
    </describe>
</book>

 

  定义元素:

  格式:<!ELEMENT 元素名 元素类型描述>

  元素类型描述主要有如下几种:

类型描述语法
任意类型这种元素即可以是字符串,也可以是其他子元素<!ELEMENT 元素名 ANY>
字符串值这种元素只能是字符串,不能包含其他子元素<!ELEMENT 元素名 (#PCDATA)>
空元素这种元素只能为空元素,空元素前面有介绍<!ELEMENT 元素名 EMPTY>
包含子元素元素中可以出现子元素<!ELEMENT 父元素 (子元素)>
混合类型可以出现以上的类型<!ELEMENT 父元素 (#PCDATA|子元素|子元素|子元素...)>

   现在我们就利用上面所学的知识简单的写一个DTD:

language.dtd:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language ANY>
<!ELEMENT codeLanguage (#PCDATA | Java | C | Python)* >
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C EMPTY>
<!ELEMENT Python EMPTY>

language.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<language>
    <C />
    <codeLanguage>
        <C />
        <Python />
        <Java>
            I am Java
        </Java>
    </codeLanguage>
    <codeLanguage>
        Other Language
    </codeLanguage>
</language>

  下面讲解的是有关子元素的一些知识点:

  定义有序的子元素:如果使用引文英文逗号(,)作为子元素之间的分隔符,则子元素之间必须遵守定义的顺序。

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)>
<!ELEMENT codeLanguage (Java, C, Python)>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
    <codeLanguage>
        <Java/>
        <C/>
        <Python/>
    </codeLanguage>
</language>

上面的Java、C、Python是按照定的顺序来的

  定义互斥的子元素:互斥的子元素表名一系列子元素之间只能出现其中的一个,互斥的子元素用竖线(|)分隔

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)*>
<!ELEMENT codeLanguage (Java | C | Python)>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
    <codeLanguage>
        <Java>
            I am Java
        </Java>
    </codeLanguage>
    <codeLanguage>
        <C>
            I am C
        </C>
    </codeLanguage>
    <codeLanguage>
        <Python>
            I am Python
        </Python>
    </codeLanguage>
</language>

  子元素出现的频率:

  符号表:

符号表示频率
+表明子元素可以出现1次或者多次
*表明子元素可以出现0次或者多次
?表明子元素可以出现0次或者1次

  定义无序的子元素:DTD没有专门为定义无序的子元素提供特定的语法,如果希望定义无序的元素的话,通过前面的语法和频率组合来实现

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)*>
<!ELEMENT codeLanguage (Java | C | Python)+>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
    <codeLanguage>
        <Java>
            I am Java
        </Java>
        <Python>
            I am Python
        </Python>
    </codeLanguage>
    <codeLanguage>
        <Python>
            I am Python
        </Python>
        <C>
            I am C
        </C>
    </codeLanguage>
    <codeLanguage>
        <Python>
            I am Python
        </Python>
        <C>
            I am C
        </C>
        <C>
            I am C
        </C>
    </codeLanguage>
</language>


  定义元素属性:

  DTD为XML添加属性提供了支持,DTD中定义属性的语法格式:<!ATTLIST 属性所属的元素 属性名 属性类型 [元素对属性的约束][默认值]>

  元素对属性的约束介绍表:

约束描述
#REQUIRED必需的属性,意味着必须为该元素指定该属性
#IMPLIED该属性可有可无
#FIXED该属性的值是固定的,定义时必须指定固定值

  DTD支持的属性类型:

类型说明
CDATA该属性值只能是字符串数据
(en1 | en2 | en3)该属性值是一系列枚举值之一
ID该属性值必须是有效的标示符,且该属性值可用于表示该元素,在XML中必须唯一
IDREF该属性值必须引用自另一个已有的ID属性值
IDREFS该属性值必须引用自多个已有的ID属性值,多个ID属性值之间用空格隔开
NMTOKEN

该属性值必须是一个合法的XML名称,它也指定了该属性值是字符串数据,但比CDATA具有更强的约束,它

表明属性值只能由字母、数字、英文下划线、英文中划线、英文点号、英文冒号等组成

NMTOKENS该属性值可以是多个NMTOKEN,过个NMTOKEN之间用空格隔开
ENTITY该属性值是一个外部实体,例如图片文件
ENTITIES该属性值是多个外部实体,多个实体之间用空格隔开
NOTATION该属性值是在DTD声明过的符号(NOTATION),这是个将要过期的规范看,避免使用
xml:该属性值是一个预定义的XML值

  下面一个例子演示一个有关枚举类型、ID、IDREF、IDREFS、NMTOKEN和NMTOKENS类型的使用:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)*>
<!ELEMENT codeLanguage (Java | C | Python)+>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<!ATTLIST Java type (JavaSE | JavaEE | JavaME) #REQUIRED>
<!ATTLIST C id ID #REQUIRED>
<!ATTLIST Python ref IDREF #IMPLIED>
<!ATTLIST Python refs IDREFS #IMPLIED>
<!ATTLIST codeLanguage author NMTOKEN #IMPLIED>

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
    <codeLanguage author="xujianguo">
        <Java type="JavaEE">
            I am JavaEE
        </Java>
        <C id="c">
            I am C
        </C>
        <C id="ccc">
            I am C
        </C>
        <Python ref="c">
            I am Python
        </Python>
        <Python refs="c ccc">
            I am Python
        </Python>
    </codeLanguage>
</language>

  下面大家来看看怎么定义实体:

  语法格式:<!ENTITY 实体名 "实体值">

  使用实体的语法格式:&实体名;

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT language (codeLanguage)*>
<!ELEMENT codeLanguage (Java | C | Python)+>
<!ELEMENT Java (#PCDATA)>
<!ELEMENT C (#PCDATA)>
<!ELEMENT Python (#PCDATA)>
<!ATTLIST Java type (JavaSE | JavaEE | JavaME) #REQUIRED>
<!ATTLIST C id ID #REQUIRED>
<!ATTLIST Python ref IDREF #IMPLIED>
<!ATTLIST Python refs IDREFS #IMPLIED>
<!ATTLIST codeLanguage author NMTOKEN #IMPLIED>
<!ENTITY java "I am Java">
<!ENTITY c "I am C">
<!ENTITY python "I am Python">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "test.dtd">
<language>
    <codeLanguage author="xujianguo">
        <Java type="JavaEE">
            &java;
        </Java>
        <C id="c">
            &c;
        </C>
        <C id="ccc">
            &c;
        </C>
        <Python ref="c">
            &python;
        </Python>
        <Python refs="c ccc">
            &python;
        </Python>
    </codeLanguage>
</language>
在 XML 映射文件中,可以使用 DTD(Document Type Definition)来定义 XML 文档的结构。 DTD 是一种 XML 文档类型定义语言,它可以定义 XML 文档中元素的类型、属性和顺序等信息。在 XML 映射文件中使用 DTD 可以确保 XML 文档的结构符合规范,同时也方便解析器对 XML 文档进行验证。 下面是一个简单的 DTD 示例: ```xml <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> ``` 在这个示例中,<!DOCTYPE> 指令定义了 DTD 的声明。其中,PUBLIC 表示这个 DTD 是公共的,可以被其他文档引用;"-//mybatis.org//DTD Mapper 3.0//EN" 是 DTD 的标识符,用于唯一标识这个 DTD;"http://mybatis.org/dtd/mybatis-3-mapper.dtd" 是 DTD 文件的 URL,用于指定 DTD 文件的位置。 在使用 DTD 定义 XML 文档结构时,可以在 XML 文档中引用 DTD 文件,也可以直接在 XML 文档中嵌入 DTD 定义。例如: ```xml <!DOCTYPE mapper [ <!ELEMENT mapper (select|insert|update|delete)*> <!ELEMENT select (include? , parameter*, (if|choose|when)*, trim*, foreach*, bind*, sql, selectKey?, include*, comment*)> <!ELEMENT insert (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, values, selectKey?, include*, comment*)> <!ELEMENT update (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, set*, selectKey?, include*, comment*)> <!ELEMENT delete (selectKey?, parameter*, (if|choose|when)*, trim*, foreach*, bind*, include*, comment*)> <!ELEMENT sql (#PCDATA)> <!ELEMENT include (#PCDATA)> <!ELEMENT bind (#PCDATA)> <!ELEMENT trim ((#PCDATA) | trim)*> <!ELEMENT set (#PCDATA)> <!ELEMENT values (#PCDATA)> <!ELEMENT foreach ((#PCDATA) | trim)*> <!ELEMENT if (#PCDATA)> <!ELEMENT choose ((when | otherwise)+)> <!ELEMENT when (#PCDATA)> <!ELEMENT otherwise (#PCDATA)> <!ELEMENT selectKey (#PCDATA)> <!ELEMENT parameter (#PCDATA)> <!ATTLIST mapper namespace CDATA #IMPLIED> <!ATTLIST select id CDATA #REQUIRED parameterType CDATA #IMPLIED resultMap CDATA #IMPLIED fetchSize CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) "FORWARD_ONLY" timeout CDATA #IMPLIED useCache (true|false) "true" resultOrdered (true|false) "false"> <!ATTLIST insert id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED useGeneratedKeys (false|true) "false" keyProperty CDATA #IMPLIED keyColumn CDATA #IMPLIED selectKey CDATA #IMPLIED> <!ATTLIST update id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED> <!ATTLIST delete id CDATA #REQUIRED parameterType CDATA #IMPLIED flushCache (true|false) "false" statementType (STATEMENT | PREPARED | CALLABLE) "PREPARED" timeout CDATA #IMPLIED> <!ATTLIST sql id CDATA #IMPLIED> <!ATTLIST include refid CDATA #IMPLIED> <!ATTLIST bind name CDATA #REQUIRED value CDATA #REQUIRED> <!ATTLIST trim prefix CDATA #IMPLIED suffix CDATA #IMPLIED suffixOverrides CDATA #IMPLIED prefixOverrides CDATA #IMPLIED> <!ATTLIST set prepend CDATA #IMPLIED suffix CDATA #IMPLIED suffixOverrides CDATA #IMPLIED prefixOverrides CDATA #IMPLIED> <!ATTLIST values nullValue CDATA #IMPLIED> <!ATTLIST foreach collection CDATA #REQUIRED item CDATA #IMPLIED index CDATA #IMPLIED open CDATA #IMPLIED close CDATA #IMPLIED separator CDATA #IMPLIED> <!ATTLIST if test CDATA #REQUIRED> <!ATTLIST when test CDATA #REQUIRED> <!ATTLIST selectKey keyProperty CDATA #IMPLIED resultType CDATA #IMPLIED order CDATA #IMPLIED> <!ATTLIST parameter property CDATA #IMPLIED javaType CDATA #IMPLIED jdbcType CDATA #IMPLIED mode CDATA #IMPLIED resultMap CDATA #IMPLIED numericScale CDATA #IMPLIED typeHandler CDATA #IMPLIED> ]> ``` 在这个示例中,DST 声明了一个名为 mapper 的元素,它包含 0 个或多个 select、insert、update、delete 元素,且这些元素可以以任意顺序出现。同时,还定义了这些元素的属性和属性值,如 select 元素必须包含 id 属性,而 insert 元素可以包含 useGeneratedKeys 和 selectKey 属性等。 通过 DTD,我们可以定义出符合规范的 XML 文档结构,并对 XML 文档进行验证,从而确保数据的正确性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值