• 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>
  • 相关阅读:
    趣图:程序员告诉你为什么充钱后速度更快
    金三银四铜五铁六,面试得做好这个准备
    Java中如何模拟真正的同时并发请求?
    趣图:程序员最头疼的原因
    Java并发面试题
    linux内存分配与回收
    7.3 Set集合
    7.2 Java 11新增的Collection和Iterator接口
    7.1 Java集合概念
    6.5 正则表达式
  • 原文地址:https://www.cnblogs.com/Ray-xujianguo/p/3338846.html
Copyright © 2020-2023  润新知