精华内容
下载资源
问答
  • DTD

    2019-06-11 09:40:00
    DTD 1.DTD简介 (1)DTD,Document Type Definition,文档类型定义. (2)DTD用于约束xml的文档格式,保证xml是一个有效的xml. (3)DTD可以分为两种,内部DTD,外部DTD. 2.使用内部DTD (1)...

    DTD

    1.DTD简介

    (1)DTD,Document Type Definition,文档类型定义.

    (2)DTD用于约束xml的文档格式,保证xml是一个有效的xml.

    (3)DTD可以分为两种,内部DTD,外部DTD.

    2.使用内部DTD

    (1)内部DTD的定义,语法如下:

    <!DOCTYPE 根元素 [元素声明]>

    (2)元素声明语法:

    <!ELEMENT 元素名 (子元素[, 子元素...])>

    (3)数量词

      >+:表示出现1次或多次,至少一次

      >?:表示出现0次或1次

      >*:表示出现任意次

    (4)属性声明语法:

      >属性类型:CDATA,表示字符数据(character data)

      >默认值:

        - #REQUIRED ,表示必须出现

        - #IMPLIED,表示不是必须的

    <!ATTLIST 元素名称 属性名称 属性类型 默认值>

    (5)带DTD的完整xml代码:

    <?xml version="1.0" econding="UTF-8"?>
    <!-- 声明内部DTD -->
    <!DOCTYPE scores [
        <!ELEMENT scores (student+)>
        <!ELEMENT student (name,course,score)>
        <!ATTLIST student id CDATA #REQUIRED>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT course (#PCDATA)>
        <!ELEMENT score (#PCDATA)>
    ]>
    <scores>
        <student id="1">
            <name>张三</name>
            <course>java</course>
            <score>89</score>
        </student>
        <student id="2">
            <name>李四</name>
            <course>sql</course>
            <score>69</score>
        </student>
    </scores>

    3.使用外部DTD

    (1)创建一个独立的DTD文件:scores.dtd

    <?xml version="1.0" econding="UTF-8"?>
     <!ELEMENT scores (student+)>
     <!ELEMENT student (name,course,score)>
     <!ATTLIST student id CDATA #REQUIRED>
     <!ELEMENT name (#PCDATA)>
     <!ELEMENT course (#PCDATA)>
     <!ELEMENT score (#PCDATA)>

    (2)在xml中引入外部DTD文件

    <!-- 引入外部DTD文件 -->
    <!DOCTYPE scores SYSTEM "scores.dtd">

     

    posted @ 2019-06-11 09:40 M_x_j 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • DTD算法

    千次阅读 2016-08-16 10:41:29
    DTD

    1. 基于能量的检测方法

    这个能量指的是短时能量,原理就是近端说话的时候,理论上应该声音能量明显大于只有回声的时候。

    1.1 GEIGEL算法

    把扬声器输出的信号与麦克风采集到的信号做能量比较,采集到的信号如果能量高于输出信号的话,则说明一定有回声。除非麦克风有放大输入信号的作用。由于输入信号和播放信号之间有一定的时延,所以拿当前的输入信号和一段时间之内(取大于等于时延的最小值)的输出信号的最大值做对比,如果输入信号大于这个值,则认为有double talk。 当然精确的说,应该是取正好是从当前时间向前推时延个时间单位的扬声器输出信号和输入做对比。但。。。GEIGEL木有这么做。
    例子代码在 https://www.ietf.org/mail-archive/web/avt/current/msg04629.html

    int dtdNdx;
        /* For Normalized Least Means Square - Pre-whitening */
        #define NLMS_LEN  (240*8)             /* maximum NLMS filter length in taps
        #define DTD_LEN 16          // block size in taps to optimize DTD
    float max_x[NLMS_LEN/DTD_LEN];
    /* Geigel Double-Talk Detector
     *
     * in d: microphone sample (PCM as floating point value)
     * in x: loudspeaker sample (PCM as floating point value)
     * return: 0 for no talking, 1 for talking
     */
      int dtd(float d, float x);
    int AEC::dtd(float d, float x)
    {
      // optimized implementation of max(|x[0]|, |x[1]|, .., |x[L-1]|):
      // calculate max of block (DTD_LEN values)
      x = fabsf(x);
      if (x > max_x[dtdNdx]) {
        max_x[dtdNdx] = x;
        if (x > max_max_x) {
          max_max_x = x;
        }
      }
      if (++dtdCnt >= DTD_LEN) {
        dtdCnt = 0;
        // calculate max of max
        max_max_x = 0.0f;
        for (int i = 0; i < NLMS_LEN/DTD_LEN; ++i) {
          if (max_x[i] > max_max_x) {
            max_max_x = max_x[i];
          }
        }
        // rotate Ndx
        if (++dtdNdx >= NLMS_LEN/DTD_LEN) dtdNdx = 0;
        max_x[dtdNdx] = 0.0f;
      }
    
      // The Geigel DTD algorithm with Hangover timer Thold
      if (fabsf(d) >= GeigelThreshold * max_max_x) {
        hangover = Thold;
      }
    
      if (hangover) --hangover;
    
      if (max_max_x < UpdateThreshold) {
        // avoid update with silence or noise
        return 1;
      } else {
        return (hangover > 0);
      }
    }`

    1.2 基于能量平均的算法

    2. 基于信号相关性的检测方法

    利用信号相关度,其实就是算余弦相似性,计算扬声器输出信号,麦克风输入信号,回声估计信号之间的相似性计算。若木有dtd时,麦克风输入信号和回声估计信号之间的相似度很大,这样把自适应滤波器的输入回声参考信号和输出回声估计信号的每一帧的采样值做两个矢量,计算他们的夹角。当没有DTD时,该夹角的余弦值基本为1,否则会明显小于1。可以设定一个阈值,小于该阈值时定义为DTD状态。

    展开全文
  • DTD 教程 DTD 实例

    2010-02-21 09:37:42
    DTD 教程 ================== DTD 首页 DTD 简介 DTD 构建模块 DTD 元素 DTD 属性 DTD 实体 DTD 验证 DTD 实例 DTD 总结
  • J2EE进阶(十九)Nested exception: java.io.FileNotFoundException: http://hibernate.org/dtd/hibernate-mapping-3.0.dtd  在调试过程中,莫名奇妙的出现了“Nested exception:java.io.FileNotFoundException: ...

    #J2EE进阶(十九)Nested exception: java.io.FileNotFoundException: http://hibernate.org/dtd/hibernate-mapping-3.0.dtd
      在调试过程中,莫名奇妙的出现了“Nested exception:java.io.FileNotFoundException: http://hibernate.org/dtd/hibernate-mapping-3.0.dtd”的错误,截图如下:
    这里写图片描述
      对于这一错误,查看错误提示可知,是由于“http://hibernate.org/dtd/hibernate-mapping-3.0.dtd%20”文件找不到造成的。之前也没有找不到这一文件啊。由于是获取网络文件,怀疑是网络造成的问题,可是网络链接良好。从网上搜寻答案,一番折腾一无所获,回去继续看错误报告,结合错误源文件,发现了下面的异常。
    这里写图片描述
      原来是由于不知何时手误将“http://hibernate.org/dtd/hibernate-mapping-3.0.dtd%20”的后面多加了一个空格,导致文件找不到了。我只想说“这也可以?”将空格删除之后,问题得到解决。
      后期经过确认,是由于利用Hibernate的反向工程生成.hbm.xml文件时多加的一个空格,坑!
    ##附 org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
      分析及解决:
      要操作的数据表中的id(即主键)的类型设置成了“自动增长类型”,而在你的
    hibernate.cfg.xml中,id的生成方式是assigned,即

    <id name="id" type="integer">
        column name="id" />
        <generator class="assigned" />
    </id>
    

      这种搭配是矛盾的!因为主键的assigned生成方式由程序自动生成表的主键,即在你的测试程序中要调用setId()方法,且必须在调用save()前调用(或者说在调用save()前必须指定id,其实就是说,主键值不能为空!)。
      把主键的生成方式改为native,它的特征是能够根据底层数据库自动选择主键生成方式。

    ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/46cc348062c27bf57424afe162b04ab4.png) ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/f9c024e20306fb0e4e3e84a15aab3217.png)
    展开全文
  • DTD简介

    2011-01-25 10:52:00
    DTD

    Dtd简介

    一个“有效的”文件首先应该是“形式良好”的。但这还远远不够,它还要往前更进一步。一个XML文件必须遵守文件类型描述Dtd(Document Type Definition)中定义的种种规定。所有的文件都是由序言和文件体构成的。序言中包含了XML声明,在序言中还可以包含Dtd定义。
    内部Dtd

    一个“有效的”文件首先应该是“形式良好”的。但这还远远不够,它还要往前更进一步。一个XML文件必须遵守文件类型描述Dtd(Document Type Definition)中定义的种种规定。所有的文件都是由序言和文件体构成的。序言中包含了XML声明,在序言中还可以包含Dtd定义。

    最简单的使用Dtd的方法是在XML文件的序言部分加入一个Dtd描述,加入的位置是紧接在XML处理指示之后。一个包含Dtd的XML文件的结构为:

    <?xml version = "1.0" encoding="Gb2312" standalone = "yes"?>
    <?DOCTYPE 根元素名[
    元素描述
    ]>
    文件体.......



    这样,我们就定义了一个文件,它以DOCTYPE中规定的根元素名作为其根元素的名字。

    如果为每一个XML文件加入一段Dtd定义,是相当繁琐的。而且,更多的情况下,我们会为一批XML文件定义一个相同的Dtd。例如,对于报社中的每篇稿件,它们都有相同的格式,可以采用一个统一的Dtd,为每一篇单独定义既麻烦,又不利于统一格式。好在XML规范为我们提供了解决这个问题的方法,它就是外部Dtd。
    v

    外部Dtd的好处是:它可以方便高效地被多个XML文件所共享。你只要写一个Dtd 文件,就可以被多个XML文件所引用。事实上,当许多组织需要统一它们的数据交换格式时,它们就是通过外部Dtd来完成的。这样做不仅简化了输入工作,还保证当你需要对Dtd做出改动时,不用一一去改每个引用了它的XML文件,只要改一个公用的Dtd文件就足够了。

    为了引用一个外部Dtd,必须修改XML声明和DOCTYPE声明。

    XML声明中必须说明这个文件不是自成一体的,即standalone属性的属性值不再是yes了:

    <?xml version = "1.0"  encoding="Gb2312"  standalone = "no"?>



    在DOCTYPE声明中,应该加入SYSTEM属性:<!DOCTYPE 根元素名 SYSTEM "外部Dtd文件的URL">

    例如:

    <!DOCTYPE 联系人列表 SYSTEM "http://www.mydomain.com/dtds/fclml.dtd">



    上面的URL是一个绝对路径,除此以外,它还可以是一个相对路径,如: <!DOCTYPE 联系人列表 SYSTEM "fclml.dtd"> 它说明这个Dtd文件和引用它的XML文件在同一个目录下。

    使用这种方法,你可以方便地把Dtd文件从你的XML文件中分离出来,粘贴到另一个文件fclml.dtd中。这样,你就得到一个Dtd文件和一个有效的XML文件。


    公用Dtd

    使用外部Dtd时,要在DOCTYPE中使用关键字SYSTEM。实际上,SYSTEM不是引用外部Dtd的唯一方法,这个关键字主要用于引用一个作者或组织所编写的众多 XML文件中通用的Dtd。还存在一种外部Dtd,它是一个由权威机构制订的,提供给特定行业或公众使用的Dtd。因此,另一个引用外部Dtd的办法是使用关键字 PUbLIC,引用这一类公开给公众使用的Dtd。

    当使用关键字PUbLIC进行引用时,这个外部Dtd还需要得到一个标识名。引用公共Dtd的形式为: <!DOCTYPE 根元素 PUbLIC "Dtd名称" "外部Dtd的URL">

    请见下面例子:

    <!DOCTYPE 联系人列表 PUbLIC "联系人Dtd" "http://www.mydomain.com/dtds/fclml.dtd">



    这个Dtd标识的命名规则和XML文件的命名规则稍有不同。具体地说,Dtd名称只能包含字母、数字、空格和下面的符号:_%$#@()+:=/!*;?。同时,Dtd名称还必须符合一些标准的规定。例如,ISO标准的Dtd以“ISO”三个字母开头;被改进的非ISO 标准的Dtd以加号“+”开头;未被改进的非ISO标准的Dtd以减号“-”开头。

    无论是哪一种情况,开始部分后面都跟着两个斜杠“//”及Dtd所有者的名称。在这个名称之后又是两个斜杠“//”,再然后是Dtd所描述的文件的类型。最后,在又一对斜杠之后是语言的种类(参见ISO 639)。例如下面这个公用Dtd的引用:

    <!DOCTYPE 联系人列表 PUbLIC "-//Luna Dong//Contact Data//CN" "http://www.mydomain.com/dtds/fclml.dtd">



    看上去的确比较复杂,不过没关系,对于Dtd的命名通常不是它的引用者的任务,XML 文件的编写者只要在自己的文件中把事先定义好的Dtd名称放在相应的位置中就可以了。



    元素类型声明1

    一个Dtd不仅要告诉语法分析器它所关联的XML文件的根元素是什么,而且还要告诉语法分析器文件的内容和结构,说清文件结构中的每一个细节。为了定义这些细节,我们必须展开Dtd中元素说明部分,使用元素类型声明(Etd)来声明所有有效的文件元素。

    Etd不但说明了每个文件中可能存在的元素,给出了元素的名字,而且给出了元素的具体类型。一个XML元素可以为空,也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。Dtd正是通过元素之间的父子关系,描述了整个文件的结构关系。

    Etd应该采用如下的结构: <!ELEMENT 元素名 元素内容描述>

    因此,在前面的例子里,可以在文件序言中通过如下方式定义“联系人列表”这个元素:

    <?xml version = "1.0" encoding="Gb2312" standalone = "yes"?>
    <!DOCTYPE 联系人列表[
    <!ELEMENT 联系人列表 ANY>
    ]>
    <联系人列表>
    ...
    </联系人列表>



    这个Dtd定义了一个XML文件,它只有一个根元素,名为“联系人列表”,这个元素可以有任何类型的子元素,也可以是纯文本,还可以为空。

    但是需要注意,尽管元素“联系人列表”被定义为“可以”包含其它元素,但实际上这个 Dtd除了“联系人列表”元素本身外没有定义任何其它元素,所以也就没有其它元素可以用作“联系人列表”的子元素。“有效的”XML文件规定文件中所使用的任何元素都必须在Dtd中给出定义。

    在“ANY”定义下使用任何纯文本都是无须另加说明的,这一点与元素不同。故而,在相同的Dtd定义下,下面一段XML文件则是合法的:

    <?xml version = "1.0" encoding="Gb2312" standalone = "yes"?>
    <!DOCTYPE 联系人列表[
    <!ELEMENT 联系人列表 ANY>
    ]>
    <联系人列表>
    纯文本信息说明联系人信息
    </联系人列表>



    元素类型声明2

    为了使元素“联系人列表”中还可以包含其它元素,从而使前面的那个文件是“有效 的”,我们还需要定义元素“联系人”和“姓名”。

    <?xml version = "1.0" encoding="Gb2312" standalone = "yes"?>
    <!DOCTYPE 联系人列表[
    <!ELEMENT 联系人列表 ANY>
    <!ELEMENT 联系人(姓名)>
    <!ELEMENT 姓名(#PCDATA)>
    ]>
    <联系人列表>
    <联系人>
    <姓名>张三</姓名>
    </联系人>
    </联系人列表>



    现在我们已经定义了一个XML文件,它的根元素名为“联系人列表”。“联系人列表” 中可以包含任何纯文本数据,也可以含有子元素(这即是ANY的含义)。根据后面的定义,我们知道,“联系人列表”中可以包含子元素“联系人”,也可以直接包含子元素“姓名”;“联系人”元素又可以包含自己的子元素,名为“姓名”;而“姓名”则只能包含纯文本数据(即(#PCDATA))。

    注意:


    除了根元素外,在定义其它元素时使用关键字ANY都是不好的习惯。
    在定义元素时,Etd的顺序是无关紧要的。
    还有一点要注意,不能对不同的元素使用相同的元素名,即便这些元素的内容、包含的子元素不同也不行,因为它只会引起文件各个元素的混淆,使文件的可读性大打折扣。
    元素名的第一个字母必须是字母、或下划线(_)、或冒号(:),后跟字母、数字、句号(.)、冒号、下划线、连结号(-)的组合,并且不能包含空白符,不能以 “xml”开头。尽管XML1.0标准允许使用任何长度的文件名,但是实际的XML处理器常常会限制标记名的长度。



    定义元素及其子元素

    对于以下的例子:

    <?xml version = "1.0" encoding="Gb2312" standalone = "yes"?>
    <!DOCTYPE 联系人列表[
    <!ELEMENT 联系人列表 ANY>
    <!ELEMENT 联系人(姓名)>
    <!ELEMENT 姓名(#PCDATA)>
    ]>
    <联系人列表>
    <联系人>
    <姓名>张三</姓名>
    </联系人>
    </联系人列表>



    准确的说法是,元素“联系人”必须包含一个,且只能包含一个子元素“姓名”。可如果子元素是“EMAIL地址”怎么办?联系人可能根本没有自己的EMAIL邮箱,也可能有好几个EMAIL帐号。

    使用正则表达式,我们就可以解决上述问题,描述父元素与子元素之间非常复杂的关系。例如,你可以对一个元素作如下任何一种类型的定义:它有一个子元素,有一个或多个子元素,有零个或多个子元素,至少有一个子元素。你还可以定义复合关系,比如“元素X是有效的,如果它含有一个或多个子元素Y,或一个子元素Z”。

    元素定义是由它们的元素内容模型(ECM)来描述的,也就是说,是由紧跟元素后面的括号中的内容来定义的。因此,正如我们前面见到的,元素“联系人”的ECM被描述为子元素“姓名”: <!ELEMENT 联系人(姓名)>

    ECM中的内容采取一组正则表达式的形式。在下表中,我们列出了正则表达式中可能出现的元字符:
    元字符 含义
    + 出现一次或多次
    * 出现零次或多次
    ? 可选,不出现或出现一次
    () 一组要共同匹配的表达式
    | OR,或,AND 要求严格遵从顺序要求


    下面几节中,我们将通过一些例子具体讲解这些元字符的用法,对使用正则表达式来定义ECM的方法获得一些感性认识。



    有顺序的子元素

    一个元素的各个子元素之间可以以任意顺序出现,也可以强制遵循一定的顺序。

    考虑下面的Dtd定义:

    <!ELEMENT 联系人(姓名 EMAIL)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>



    遵从这个Dtd的XML文件可以为:

    <联系人>
    <姓名>张三</姓名>
    <EMAIL>zhang@aaa.com</EMAIL>
    </联系人>



    同样,下面这个XML文件也是有效的:

    <联系人>
    <EMAIL>zhang@aaa.com</EMAIL>
    <姓名>张三</姓名>
    </联系人>



    由于我们在Dtd定义中仅仅用空白符分隔了元素“联系人”的两个子元素,这说明我们并没有严格要求两个元素出现的顺序,因此上面两种写法都是允许的。如果我们使用逗号“,”来分隔两个子元素,那么XML文件中,元素“姓名”就必须出现在元素“EMAIL”前面。


    重复元素

    让我们再把上节的例子作一个小小的改动:

    <!ELEMENT 联系人(姓名,EMAIL+)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>



    让我们看看前面给出的正则表达式的元字符集列表,它说明一个“联系人”元素中必须含有一个“姓名”元素,后面接一个或多个“EMAIL”元素。这样,下面的这段XML 文件是“有效的”。

    <联系人>
    <姓名>张三</姓名>
    <EMAIL>zhang@aaa.com</EMAIL>
    <EMAIL>zhang@hotmail.com</EMAIL>
    <EMAIL>zhang@yahoo.com</EMAIL>
    </联系人>



    那么下面这段XML文件不是有效的,因为它没有“EMAIL”元素,而“+”代表了“一个或多个”。

    <联系人>
    <姓名>张三</姓名>
    </联系人>



    如果你需要表示“零个或多个”,那么应该使用字符“*”。例如:

    <!ELEMENT 联系人(姓名,EMAIL*)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>



    成组元素

    子元素可以使用括号并为一组。因此,下面的Dtd片段说明,一个“联系人”元素中可以有一个或多个“姓名/EMAIL”子元素对,并且在每个子元素对中,“姓名”都放在“EMAIL”之前。

    <!ELEMENT 联系人(姓名,EMAIL)+>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>



    符合这个Dtd的XML文件可以是:

    <联系人>
    <姓名>张三</姓名>
    <EMAIL>zhang@aaa.com</EMAIL>
    <姓名>李四</姓名>
    <EMAIL>li@bbb.org</EMAIL>
    <姓名>王五</姓名>
    <EMAIL>wang@ccc.org</EMAIL>
    </联系人>



    注意,仅仅是因为“+”由括号里面移到括号外面,元素“联系人”的内容就大大不同了。




    OR或

    号“|”描述了一个OR操作。因此,下面的Dtd片段所规定的XML元素是:所有的 “联系人”元素应该有一个“姓名”子元素,同时,在此之后还应该有一个“电话”或一个“EMAIL”元素,但不能同时有“电话”和“EMAIL”两个元素。

    <!ELEMENT 联系人(姓名,(电话|EMAIL))>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT 电话(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>



    一个符合上述Dtd定义的“有效的”XML文件的定义应该是:

    <联系人>
    <姓名>张三</姓名>
    <电话>12345678</EMAIL>
    </联系人>



    或者是:

    <联系人>
    <姓名>张三</姓名>
    <EMAIL>zhang@yahoo.com</EMAIL>
    </联系人>



    注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。因此,象下面这样定义的Dtd是不合法的:<!ELEMENT 联系人(姓名,电话|EMAIL)>

    要想使用多种连接符,只有通过创建子组的方式,使用<!ELEMENT 联系人(姓名,(电话|EMAIL))>




    可选子元素

    字符“?”说明一个子元素是可选的,它可以出现,也可以不出现。因此,在下面的Dtd 中,我们规定,每一个“联系人”都必须有一个“姓名”子元素,同时或者有一个“电话” 子元素,或者有一个“EMAIL”子元素,此外,它还可以包含一个“地址”子元素,也可以不包含这种元素。

    <!ELEMENT 联系人(姓名,(电话|EMAIL),地址?)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT 电话(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>
    <!ELEMENT 地址(街道,城市,省份)>
    <!ELEMENT 街道 (#PCDATA)>
    <!ELEMENT 城市 (#PCDATA)>
    <!ELEMENT 省份 (#PCDATA)>



    根据这个Dtd描述,下面的XML片段是“有效的”:

    <联系人>
    <姓名>张三</姓名>
    <EMAIL>zhang@aaa.com</EMAIL>
    <地址>
    <街道>五街1234号</街道>
    <城市>北京市</城市>
    <省份>北京</省份>
    </地址>
    </联系人>



    同样,下面这段不包含“地址”元素的XML片段也是“有效的”:

    <联系人>
    <姓名>张三</姓名>
    <EMAIL>zhang@aaa.com</EMAIL>
    </联系人>



    混合内容&空元素

    当然,可能也有一些时候,你在一个元素中既希望包含子元素,也希望包含纯文本。 XML中允许这种使用方法,并把这种元素称为混合内容的元素。在下面的例子中, “联系人”就是一个混合元素。

    <?xml version = "1.0" encoding="Gb2312" standalone = "yes"?>
    <!DOCTYPE CONTACTS [
    <!ELEMENT 联系人列表 ANY>
    <!ELEMENT 联系人(姓名|电话|EMAIL|#PCDATA)*>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT 电话(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>
    ]>
    <联系人列表>
    <联系人>
    <姓名>张三</姓名>
    <电话>(010)62345678</电话>
    <EMAIL>zhang@aaa.com</EMAIL>
    这是关于张三的信息
    </联系人>
    </联系人列表>



    注意,由于在“(姓名|电话|EMAIL|#PCDATA)”之外有“*”,所以在元素“联系人”中可以包含零个或多个“姓名”、电话、EMAIL和纯文本字段。

    还有一种情况没有说,那就是,一个元素中不包含任何子元素,也不包含纯文本。对于这种情况,我们可以定义一个空标记。当然,定义这样一个标记很简单,你只需要使用关键字EMPTY就可以了,例如:<!ELEMENT HR EMPTY> 这样,在你的XML文件中,就可以使用一个空元素<HR/>。




    定义有效的元素属性

    现在我们已经学会如何定义一个元素以及它的内容,如何描述父元素与子元素之间错综复杂的关系,只差不知道如何定义元素的属性了。

    在第二篇教程中我们曾经提到过属性,那个例子是一个有关“商品”的元素,它有两个属性,即“类型”和“颜色”:<商品 类型 = "服装" 颜色 = "黄色">

    在Dtd中定义属性时,我们使用下面的格式: <!ATTLIST 元素名 (属性名 属性类型 缺省值)*>

    元素名是属性所属的元素的名字,在上面例子中,元素名是“商品”;属性名是属性的命名,例子中,“类型”和“颜色”是属性名;缺省值说明在XML文件中,如果没有特别说明属性的取值,语法分析器默认它具有的取值;属性类型则用来指定该属性是属于十个有效属性类型中的哪种类型。

    注意:由于ATTLIST是一个属性的列表,它可以包含很多属性,在实际应用中,一个元素也经常有多个属性。

    上面例子中的属性可以如下定义:

    <!ATTLIST 商品
    类型 CDATA #REQUIRED
    颜色 CDATA #IMPLIED
    >



    在元素说明的四个部分中,我们需要再详细讨论一下元素类型和缺省值。在下一节中,我们就从缺省值说起。



    属性缺省值

    根据XML文件是否必须为一个属性提供取值,属性的缺省值又可以分为以下三类:

    必须赋值的属性
    关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。例如,假设你想定义一个"页面作者"元素,并把这个元素加入所有网站中的每一个页面。之所以定义这个元素,是为了页面编辑者能够提供他的联系信息,以便当发现页面错误或无效链接时,可以及时地通知他。在这种情况下,每个页面作者都有不同的个人信息,所以你无法事先知道应该用什么作为缺省值,但你又的确需要提供每个人的信息。这时候,你就可以把与联系信息相关的属性定义为必须的(REQUIRED),而且不用提供缺省值。
    属性值可有可无的属性
    当使用IMPLIED关键字时,文法解释器不再强行要求你在XML文件中给该属性赋值,而且也无须在Dtd中为该属性提供缺省值。可以说,这是对属性值有无的最低要求,现实中经常用到。
    固定取值的属性
    还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML 文件的编写者把你的缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。
    定义缺省值的属性
    如果不使用上面任何一种关键字的话,该种属性就是属于这种类型。对于这种属性,你需要在Dtd中为它提供一个缺省值。而在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,后一种情况下它就默认为采用Dtd中给出的缺省值。
    至于究竟采用哪种缺省值,就看实际需要了。下面给出一个具体的例子:

    <!ATTLIST 页面作者
    姓名 #CDATA #IMPLIED
    年龄 #CDATA #IMPLIED
    联系信息 #CDATA #REQUIRED
    网站职务 #CDATA #FIXED "页面作者"
    个人爱好 #CDATA "上网">




    属性类型

    一个元素可以为以下十种类型中的任意一种:

    CDATA
    Enumerated
    ID
    IDREF
    IDREFS
    ENTITY
    ENTITIES
    NMTOKEN
    NMTOKENS
    NOTATION



    下面我们就来一个一个讲述。



    CDATA类型

    CDATA指的是纯文本,即由字符、符号“&”、小于号“<”和引号“"”组成的字符串。当然,就象我们前面讲到的,你应该使用实体&代替“&”,<代替“<”, "代替“"”。

    请看下面这个关于剧本的例子:

    <?xml version = "1.0"
    encoding="Gb2312"
    standalone = "yes"?>
    <!DOCTYPE 剧本 [
    <!ELEMENT 剧本 ANY>
    <!ELEMENT 对话 (#PCDATA)>
    <!ATTLIST 对话 演员 CDATA>
    ]>
    <剧本>
    <对话 演员="某甲">我可不这么认为!</对话>
    <对话 演员="某乙">为什么呢?</对话>
    </剧本>




    枚举类型

    属性也可以被描述为一组可接受的取值的列表,XML文件中对属性的赋值将从这个列表中选取一个值。这类属性属于枚举类型ENUMERATED,不过,关键字ENUMERATED是不出现在Dtd定义中的。

    <?xml version = "1.0"
    encoding="Gb2312"
    standalone = "yes"?>
    <!DOCTYPE 购物篮 [
    <!ELEMENT 购物篮 ANY>
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 类型( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
    ]>
    <购物篮>
    <肉 类型 = "鱼肉"/>
    <肉 类型 = "牛肉"/>
    <肉/>
    </购物篮>



    注意,在上面这个例子中,给属性“类型”定义的缺省值是“鸡肉”,所以“购物篮”中的第三个元素的“类型”属性取值为“鸡肉”。




    ID和IDREF

    ID类型
    ID是用属性值的方式为文件中的某个元素定义唯一标识的方法,它的作用类似于 HTML文件中的内部链接。在大多数情况下,ID由处理文件的程序或脚本语言使用。

    ID的值必须是一个有效的XML名称,它由字母、数字或下划线开始,名字中不能出现空白符。另外一般而言,不要给ID类型的属性事先指定缺省值,这很容易引起不同的元素具有相同的标识的情况,更不能使用FIXED型的缺省值。此类属性经常使用REQUIRED缺省类型,当然,这也不是必须的。有的应用并不要求每个元素都有自己的标识,所以,也可以使用IMPLIED缺省类型。

    <?xml version = "1.0"
    encoding="Gb2312"
    standalone = "yes"?>
    <!DOCTYPE 联系人列表[
    <!ELEMENT 联系人列表 ANY>
    <!ELEMENT 联系人(姓名,EMAIL)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>
    <!ATTLIST 联系人 编号 ID #REQUIRED>
    ]>
    <联系人列表>
    <联系人 编号="1">
    <姓名>张三</姓名>
    <EMAIL>zhang@aaa.com</EMAIL>
    </联系人>
    <联系人 编号="2">
    <姓名>李四</姓名>
    <EMAIL>li@bbb.org</EMAIL>
    </联系人>
    </联系人列表>




    ID和IDREF2

    IDREF类型
    IDREF类型允许一个元素的属性使用文件中的另一个元素,方法就是把那个元素的 ID标识值作为该属性的取值。例如下面的例子:

    <?xml version = "1.0"
    encoding="Gb2312"
    standalone = "yes"?>
    <!DOCTYPE 联系人列表[
    <!ELEMENT 联系人列表 ANY>
    <!ELEMENT 联系人(姓名,EMAIL)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>
    <!ATTLIST 联系人 编号 ID #REQUIRED>
    <!ATTLIST 联系人 上司 IDREF #IMPLIED>
    ]>
    <联系人列表>
    <联系人 编号="2">
    <姓名>张三</姓名>
    <EMAIL>zhang@aaa.com</EMAIL>
    </联系人>
    <联系人 编号="1" 上司="2">
    <姓名>李四</姓名>
    <EMAIL>li@aaa.com</EMAIL>
    </联系人>
    </联系人列表>




    NMTOKEN和NMTOKENS

    类型NMTOKEN和NMTOKENS是诸多属性类型中面向处理程序的又一个类型。这两个类型用于指示一个有效的名字。当需要把一个元素和其它的元件,例如一个JAVA 类或一个安全算法,相联系时,可以让它们助你一臂之力。请看下面的例子:

    关于元素的定义:

    <!ELEMENT 数据(#PCDATA)>
    <!ATTLIST 数据
    安全性( ON | OFF ) "OFF"
    授权用户 NMTOKENS #IMPLIED
    >



    XML文件:

    <数据 安全性="ON" 授权用户 = "Iggieeb SelenaS Guntherb">
    blah blah blah
    </数据>



    NOTATION类型

    NOTATION类型允许属性值为一个Dtd中声明的符号,这个类型对于使用非XML格式的数据非常有用。

    现实世界中存在着很多无法或不易用XML格式组织的数据,例如图象、声音、影象等等。对于这些数据,XML应用程序常常并不提供直接的应用支持。通过为它们设定 NOTATION类型的属性,可以向应用程序指定一个外部的处理程序。例如,当你想要为一个给定的文件类型指定一个演示设备时,可以用NOTATION类型的属性作为触发。

    要使用NOTATION类型作为属性的类型,首先要在Dtd中为可选用的记号作出定义。定义的方式有两种,一种是使用MIME类型,形式是:
    <!NOTATION 记号名 SYSTEM "MIME类型">

    再有一种是使用一个URL路径,指定一个处理程序的路径。
    <!NOTATION 记号名 SYSTEM "URL路径名">

    在下面这个例子中,为"电影"元素指定了两种可选设备:一种是movPlayer.exe,用来播映.mov文件,另一种则用来绘制GIF图象。

    <?xml version = "1.0"
    encoding="Gb2312"
    standalone = "yes"?>
    <!DOCTYPE 文件[
    <!ELEMENT 文件 ANY>
    <!ELEMENT 电影 EMPTY>
    <!ATTLIST 电影 演示设备 NOTATION ( mp | gif ) #REQUIRED>
    <!NOTATION mp SYSTEM "movPlayer.exe">
    <!NOTATION gif SYSTEM "Image/gif">
    ]>
    <文件>
    <电影 演示设备 = "mp"/>
    </文件>


    实体属性类型与参数实体

    实体在XML中充当着宏或别名的角色。实体最根本的作用是帮助你为一大段文本创建一个别名,这样,在文件的另一个位置需要引用这段文本时,仅需要指向它的别名就可以了。它还意味着一旦需要修改,仅需要在一个地方作改动,就完成了全局的改动。

    我们还提到,实体分为一般实体和参数实体两种类型,它们都可以定义为内部的也可以用关键字SYSTEM定义为外部的。实体的定义必须出现在引用之前,而且要注意正确嵌套,不能出现循环引用的情况。在Dtd中,这两种类型的实体都得到了广泛的应用。

    实体属性类型
    实体类型的属性值属于一般实体,如前所述,它的定义方式是: <!ENTITY 实体名 "实体内容">
    或利用SYSTEM定义外部实体,方式为: <!ENTITY 实体名 SYSTEM "外部文件名">
    引用方式为: &实体名;

    使用关键字ENTITY,则声明一个属性是实体类型,它的取值为已定义的实体。请看下面例子:

    <?xml version = "1.0"
    encoding="Gb2312"
    standalone = "yes"?>
    <!DOCTYPE 文件[
    <!ELEMENT 文件 ANY>
    <!ELEMENT 电影 EMPTY>
    <!ATTLIST 电影 来源 ENTITY #REQUIRED>
    <!ENTITY bladeRunner SYSTEM "dvds/bR/br.mov">
    ]>
    <文件>
    <电影 来源 = "&bladeRunner;">
    </文件>



    参数实体参数实体专门用在Dtd中。定义方式是: <!ENTITY % 实体名 "实体内容">
    或: <!ENTITY % 实体名 SYSTEM "外部文件名">
    引用方式为: %实体名;使用参数实体,可以方便元素和属性的声明。例如:

    <!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
    <!ELEMENT 个人联系信息 (%TAG_NAMES; | 生日)>
    <!ELEMENT 客户联系信息 (%TAG_NAMES; | 公司名)>



    最后提醒大家注意,不要以为实体属性类型的定义与Dtd有关,所以它使用的就是参数实体。参数实体只能在Dtd中使用,而对于任何元素属性值的指定(除了缺省值外),都是在XML文件正文中进行的,因此实体属性值仍属于一般实体。
    展开全文
  • DTD约束

    千次阅读 2018-06-01 22:33:05
    什么是DTD约束: DTD(Document Type Definition)文档类型定义,用来约束xml文档。规定xml文档中元素的名称,子元素的名称及顺序,元素的属性等等。DTD语法: 文档声明: 1、内部DTD,在xml文档内部嵌入DTD,只对...
  • DTD文件教程

    2012-12-17 13:12:29
    DTD教程 DTD 简介 DTD - XML 构建模块 DTD - 元素 DTD - 属性 DTD - 实体 DTD 验证 DTD - 来自网络的实例
  • XML之外部DTD和内部DTD

    2017-11-05 21:51:00
    DTD分为内部DTD和外部DTD,所谓内部DTD是指该DTD在某个文档的内部,只被该文档使用。外部DTD是指该DTD不在文档内部,可以被其他所有的文档来共享。 符号 含义 + >=1 ...
  • DTD验证

    2019-03-12 17:59:33
    DTD是个什么玩意? 在学习CSS的时候,应该提及到。 在XHTML文档中,就有它的身影 它的作用是什么?—确保结构书写是正确的和对css的解析(盒模型) 1.什么是Xml验证 XML中,DTD有何作用呢? Xml的作用是什么...
  • dtd设计

    2017-07-19 23:44:06
    DTD Document Type Definition,文档类型定义 格式良好:满足xml最低规范 有效:通过dtd验证的文档称为有效 符号 含义 + >=1 * >=0 ? =0 或 =1
  • xml与dtd

    2019-10-18 15:17:22
    目的:理解spring的dtd文件 DTD教程:https://www.w3cschool.cn/dtd/dtd-elements.html my.xml引用dtd,即可
  • DTD文件

    2017-03-30 21:02:39
    DTD,文档类型定义,它的作用是定义XML文档的合法构建模块,我们可以根据需要扩展自己的dtd,以满足对xml对需求。  上图就是dtd文件的定义规范,主要定义元素,定义属性,但是有一个问题,就是元素的定义不能...
  • 1、新建dtd文件,直接Flie>other>dtd 2、
  • 现象 在 idea 中使用 mybatis-generator,配置文件头部 文档类型定义报红 解决方法 点开 Settings —— Languages & Frameworks —— Schemas and DTDs... 具体配置,File 指定你的 jar 包中的 dtd 文档即可 ...
  • dtd语法

    2015-05-12 20:47:12
    1.如何在xml中引入dtd  (1)外部引入  可以将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd而文件保存时必须用utf-8编码保存.  再在xml文件中使用    如果写的是SYSTEM表明当前引入的dtd在当前...
  • 外部dtd

    2015-03-31 09:36:00
    引用外部dtd的语法:<!DOCTYPE根元素SYSTEM“DTD文档路径”> PUBLIC:公用 SYSTEM:私有 一个xml文件: 引入一个dtd文件(注意文件的后缀是dtd) 转载于:...
  • DTD语法详解

    2018-11-12 20:03:42
    DTD语法详解
  • dtd学习笔记

    2019-04-27 20:20:56
    dtd学习记录(二) 一. 基本概念 dtd的两个任务:它帮助你编写合法的代码。它让浏览器正确地显示器代码。 1.dtd是文档类型定义: 一般和xml文件配合使用,主要的用处是约束xml。(除了dtd以外,还有一个schema的...
  • DTD详解

    千次阅读 2016-01-19 11:38:37
    DTD详解 基本概述  文档类型定义(Document Type Definition)是一套为了进行程序间的数据交换而建立的关于标记符的语法规则。它是标准通用标记语言(SGML)和可扩展标记语言(XML)1.0版规格的一部分,文档可...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,845
精华内容 33,138
关键字:

dtd