zoukankan      html  css  js  c++  java
  • DTD学习总结


    一、DTD介绍

    Document Type Definition;

    DTD是一种XML的约束方式,除了此种约束方式外,还有XSchema,XSchema比DTD的约束能力还要强,因此DTD正在逐渐淘汰;

    DTD的目的就是约束XML标签的写法;比如在我们struts2开发当中,编写struts.xml时,需要遵循

    <struts>

        <package name="" namespace="" extends="">

            <action>

            </action>    

        </package>

    </struts>

    的规则,就是通过DTD进行约束的,因此我们在开发当中通过Eclipse导入DTD文件,便于开发提示,如果在开发中开发人员不遵循DTD的规范,则会出现错误提示;

    XML约束的重要性:在编写XML时,对于XML进行约束是非常重要的,因为如果对于XML不约束,则会让开发人员很难掌握;

    而DTD通常是由框架设计人员定义的,一般的开发人员只需要在XML中遵循DTD规范编写XML即可;

     

    二、导入DTD

    如果要导入DTD,可以通过两种方式:

    (1)在XML中直接编写;

    (2)在专门的DTD文件中编写,然后在XML中通过特定的语句导入DTD文件;

    1、在XML中直接编写

    语法如下:

    <!DOCTYPE 根节点[
        .........
    ]>


     

    2.XML文件中导入DTD文件

    此种方式需要考虑两个情况:

    (1)如果是本地文件,则:

    <!DOCTYPE 根节点 SYSTEM "dtd的URL">

    此处的URL指的是比如 "F:\1.dtd"

    (2)如果是共享文件,则:

    <!DOCTYPE 根节点 PUBLIC "dtd名称" "dtd的URL">


    三、DTD语法

    在DTD中可以定义XML标签的顺序、个数,属性的值,实体;

    1.XML元素定义

    语法如下:

    <!ELEMENT 元素名称 元素类型>        //定义元素的类型,但是只能是 ANY(表示任意类型)或EMPTY(空元素);

    <!ELEMENT 元素名称 (元素内容)>    //定义元素的内容,一定要加上();

    对于元素内容

    ----可以定义子元素的名称,比如:

    <!ELEMENT 元素名称 (子元素1,子元素2,子元素3)> 表示3个子元素只能出现一次,并且按照此顺序出现;

    <!ELEMENT 元素名称 (子元素1|子元素2|子元素3)> 表示3个子元素中只能出现一个;

    我们还可以定义子元素的个数,比如:

    (1)+:1次或多次;比如 (name+)表示此name元素只能出现1次或多次。

    (2)?:0次或1次;比如(name?)表示此name元素只能出现0次或1次。

    (3)*:0次或多次;比如(name*)表示此name元素任意出现几次。

    (4)无:只能一次;比如(name)表示此name元素只能出现1次。

    对于元素内容,

    ----也可以定义子元素内容的类型,比如#PCDATA,表示字符串;

    举例:

    <!DOCTYPE personlist [    <!-- 根节点为personlist-->
    <!ELEMENT personlist (person+)>    <!-- personlist的子元素为person,并且可以出现1次或多次-->
    <!ELEMENT person (name,age,salary)>    <!-- person的子元素是name,age,salary,并且可以出现一次,并且出现顺序以此顺序为准-->
    <!ELEMENT name ANY>    <!--name可以使任意类型 -->
    <!ELEMENT age (#PCDATA)>    <!-- age可以是字符串-->
    <!ELEMENT salary (#PCDATA)>    <!-- salary可以是字符串-->
    ]>
     

    从以上可以看出,DTD不可以定义数字等类型,此为DTD的缺陷;

    2.XML属性定义

    语法如下:

    <!ATTLIST 标签名

        属性名1        属性类型        属性说明

        属性名2        属性类型        属性说明

    >

    属性类型可以是

    (1)CDATA:最普通的字符串;

    (2)枚举,即(值1|值2|值3),需要括号

    (3)ID:属性值需要以字母或下划线开头;

    属性说明可以是:

    (1)#REQUIRED:必须设置;

    (2)#IMPLED:可选值,即此属性可以设置,也可以不设置;

    (3)#FIXED:固定值,通常语法为:#FIXED  "固定值"

    (4)默认值;

     

    举例:

    <!DOCTYPE personlist [
     
    <!ELEMENT personlist (person+)>
    <!ELEMENT person (name,age,salary)>
    <!ELEMENT name ANY>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT salary (#PCDATA)>
    <!ATTLIST person
    aaa CDATA #REQUIRED        <!-- -->
    bbb CDATA #IMPLIED         <!-- 可选属性-->
    ccc CDATA #FIXED "xiazdong" <!--固定值,不需要设置 -->
    ddd CDATA "XZDONG"         <!--默认值为"XZDONG", 可以自己设置 -->
    eee ID #REQUIRED             <!--ID -->
    fff (1|2|3) "1"                         <!--枚举值,默认为1 -->
    >
    ]>


    3、XML实体定义

    实体类似于一个可重用常量,或者说是ant中的classpath,可以被引用;

    语法如下:

    <!ENTITY 实体名称  "实体内容">

    引用实体语法:
    &实体名称;    注意:最后的“;”一定需要;

    注意:引用实体必须在XML中引用;

     

    举例:

    <!DOCTYPE personlist [
     
    <!ENTITY constant "aaaa">
    <!ELEMENT personlist (person+)>
    <!ELEMENT person (name,age,salary)>
    <!ELEMENT name ANY>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT salary (#PCDATA)>
     
    ]>
    <personlist>
    <person >
    <name>&constant;</name>        <!-- 引用constant实体-->
    <age>aaa</age>
    <salary>aaa</salary>
    </person>
    </personlist>
     


    小知识点:根据XML自动生成DTD

    因为一般我们写的XML基本都是没有DTD的,如果要自己写DTD,又很麻烦,因此我们可以通过工具来自动生成:trang

    功能:能够完成如下转换:

    (1)XML ---> DTD

    (2)XML --->XSchema

    (3)DTD--->XSchema


    使用方法:

    java -jar trang.jar -I xml -O dtd input.xml output.dtd 即可;

    -I xml 表示输入为xml;

    -O dtd表示输出为dtd文件;

    input.xml表示输入文件;

    output.dtd表示输出文件;

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    121.买卖股票 求最大收益1 Best Time to Buy and Sell Stock
    409.求最长回文串的长度 LongestPalindrome
    202.快乐数 Happy Number
    459.(KMP)求字符串是否由模式重复构成 Repeated Substring Pattern
    326.是否为3的平方根 IsPowerOfThree
    231.是否为2的平方根 IsPowerOfTwo
    461.求两个数字转成二进制后的“汉明距离” Hamming Distance
    206.反转单链表 Reverse Linked List
    448. 数组中缺少的元素 Find All Numbers Disappeared in an Array
    常见表单元素处理
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058076.html
Copyright © 2011-2022 走看看