• 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
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    electron创建窗口常用配置参数
    Node.js读取文件相对路径写法注意
    计算机系统安装及相关知识
    U盘无法拷贝大于4G的文件解决办法汇总
    PE盘制作
    不同数据库连接四要素总结
    如何将打印内容转换为bmp位图文件
    DPI的理解
    jmeter 函数助手里的P,property的使用
    jmeter的Include Controller控件和Test Fragment控件和Module Controller控件
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058076.html
Copyright © 2020-2023  润新知