xml笔记(三)---DTD详解

第三节 DTD详解

目前有两种xml文档定义的语义约束

1、  Dtd  document type definition

2、  xml schema

xml语义约束

web.xml

<serlvet>

  <servlet-name></servlet-name>

  <servlet-class></servlet-class>

</servlet>

<servlet-mapping>

  <servlet-name></servlet-name>

  <url-pattern></url-pattern>

</servlet-mapping>

Dtd约束包括那几个方面

1、  定义xml的根元素、内容和结构

2、  定义xml文档中可以接受那些元素

3、  定义xml文档里每个元素接受的合法内容,包括是否为空,是可以是文本,可以接受那些子元素,子元素出现的顺序和子元素出现次数等。

4、  定义xml文档中每个元素能接受那些属性

5、  定义xml文档中每个属性的类型,能接受那些值,以及元素对属性的约束等。

6、  定义属性的固定值和默认值

7、  定义xml文档或dtd中可以使用的实体。

Dtd有作用

1、  Dtd采用了非xml的语法描述语义约束,可以提供如下功能

2、  通过使用dtd可以让每个xml文件带有一个有关其自身的格式描述

3、  不同的公司、组织可一致地使用某个标准的dtd来交换数据

4、  应用程序也可以使用某个标准的dtd验证所介绍的xml文档是否符合语义约束

5、  开发者也可以使用dtd来验证所创建的xml文档。

引入dtd的方式

1、  内部dtd

2、  外部dtd

3、  公用dtd

1、  内部dtd

   语义约束与xml文档的内容放在同一个xml文档中。内部dtd紧跟在xml声明和处理指令之后,以<!DOCTYPE 开始,]>结束。其语法格式如下

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

<!DOCTYPE 根元素名[

       元素描述

  ]>

xml文档主体部分

2、  外部dtd

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

<!DOCTYPE 根元素名 SYSTEM "外部的DTDURL地址">

3、  公用dtd

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

<!DOCTYPE 根元素名 PUBLIC  "DTD的标识名"  "公用的DTDURL地址">

定义一个元素

<!ELEMENT 元素名(子元素,)>

<!ELEMENT 元素名(#PCDATA)>

DTD的文档结构如下:

   第一行是DTD声明部分 该声明与xml文档的生命语法格式相同

   0到多个注释部分,DTD注释与xml文档的注释完全相同

   0到多个<!ELEMENT…..>定义 每个它就是一个xml元素

   0到多个<!ATTLIST…..>定义每个它就是一个xml元素的属性

   0到多个<!ENTITY…..>定义每个它就是一个实体

   0到多个<!NOTATION…..>定义 每个它定义一个符号

彼此之间完全独立,无须相互嵌套。

1、 定义元素

      元素类型的定义的全称是:Element Type Defintion,简称ETD,它不但会定义每个文件中可能存在的元素,给元素的名称,而且会定义元素的具体类型。

元素类型描述主要有5种:

1、  任意类型

   可以是以下四种的内容

 语法格式:

  <!ELEMENT 元素名 ANY>

2、  字符串值

3、  空元素 <br/>

4、  包含子元素

5、  混合类型

<!--任意类型-->

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

<!DOCTYPE book[

<!ELEMENT book ANY>

]>

无效的xml文档但是格式良好的xml文档

<!--空元素-->

<!ELEMENT 元素名 EMPTY>

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

<!DOCTYPE book[

<!ELEMENT book EMPTY>

]>

有效的xml文档

<!--定义字符串内容的元素-->

<!ELEMENT 元素名 (#PCDATA)>

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

<!ELEMENT book (computer)*>

<!ELEMENT computer (book_name,price,author)>

<!ELEMENT book_name (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ELEMENT author (#PCDATA)>

<!--定义混合内容-->

<!ELEMENT 父元素名(#PCDATA|子元素1|子元素2|子元素3|........)*>  并不是互斥

|无序的重复出现 出现的次数不受限制

注意:1#PCDATA必须放在最前面

      2#PCDATA只能用|与各个子元素分隔

      3、不要试图在各个子元素之后添加?*+等表示频率的修饰符

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

<!DOCTYPE book[

<!ELEMENT book (注意:在这之间要有空格)(computer)*>

<!ELEMENT computer (#PCDATA|book_name|price|author)>

<!ELEMENT book_name (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ELEMENT author (#PCDATA)>

]> 

<book>

         <computer>

             <book_name>JavaWeb开发</book_name>

             <price>30.0</price>

            <author>kouxiaolin</author>

       </computer>

       <computer>

             <book_name>CSS应用程序的开发</book_name>

            <price>1000</price>

            <author>kouxiaolin</author>

       </computer>

</book>

定义子元素

1、  有序的子元素(,)

(,)用于分隔有序的子元素

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

<!DOCTYPE book[

<!ELEMENT book (computer)*>

<!ELEMENT computer (book_name,price,author)>

<!ELEMENT book_name (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ELEMENT author (#PCDATA)>

]> 

<book>

       <computer>

             <book_name>JavaWeb开发</book_name>

             <price>30.0</price>

            <author> kouxiaolin </author>

       </computer>

       <computer>

             <book_name>CSS应用程序的开发</book_name>

            <price>100</price>

            <author>kouxiaolin</author>

       </computer>

</book>

2、  互斥的子元素

互斥的子元素表明一系列的子元素中只能出现其中之一。

(|)

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

<!DOCTYPE book[

<!ELEMENT book (computer)*>

<!ELEMENT computer (book_name|price|author)>

<!ELEMENT book_name (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ELEMENT author (#PCDATA)>

]> 

<book>

       <computer>

             <book_name>JavaWeb开发</book_name>

       </computer>

        <computer>

             <price>30</price>

       </computer>

       <computer>

            <author> kouxiaolin </author>

       </computer>

</book>

3、  子元素出现的频率

      +: 一次或多次 (+)

            ?: 0次或一次 (?)

                 *: 0次或多次  (*)

注意:混合类型的频率只能安如下方式加:

<!ELEMENT computer (#PCDATA|book_name|price|author)*>

//#PCDATA以它开头的是混合类型 频率只能在最后加

1、组合子元素

<!ELEMENT computer (book_name|price|author)>

2、  无序的子元素

1、  定义属性

<!ATTLIST属性所属元素  属性名  属性类型[元素对属性的约束][默认值]>

元素对属性的约束|默认值是可选的对于它们的使用有如下的情况:

1、  在没有指定元素对属性的约束,必须为该属性增加默认值。

2、  在元素对属性的约束是:#REQUIRED时,不能为该属性指定默认值。

3、  在元素对属性的约束是:#IMPLIED时,不能为该属性指定默认值

4、  在元素对属性的约束是:#FIXED时,必须为该属性指定默认值

#REQUIRED:必须的属性

#IMPLIED:可有可无

    #FIXED:固定值

<水果 品名=”苹果颜色=”绿色”>关于水果的元素</水果>

属性类型

类型

说明

CDATA

字符串数据 character data

(e1|e2|e3)

该属性是一系列枚举值之一

ID

Id必须是唯一的

IDREF

引用自己已经定义的id

IDREFS

空格区分多个id

ENTITY

是一个外部的实体

ENTITIES

多个外部实体,多个外部实体之间用空格分隔

Xml:

预定义的xml

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

<!DOCTYPE 购物车[

 <!ELEMENT 购物车 (*,水果*,玩具)>

     <!ELEMENT EMPTY>

     <!ELEMENT 水果 EMPTY>

  <!ELEMENT 玩具 EMPTY>

 <!ATTLIST 类型 (鸡肉|牛肉|狗肉) #REQUIRED>

  <!ATTLIST 水果  类型  (苹果||香蕉) #IMPLIED>

    <!ATTLIST 玩具 类型  CDATA #FIXED "地雷">

]>

<购物车>

        < 类型="狗肉"/>

        <水果/>

        <玩具 类型="地雷"/>

</购物车>

属性的类型

    在属性的声明中TYPE 部分为属性的类型设定,DTD  中属性的类型有10 种,下面将

对这些数据类型进行逐一的介绍。

    1. CDATA

    CDATA   型表明属性值为不包含“< ”和“"”的任意字符串,如果属性值中需要包含

 <”和“"”,则可使用特殊字符来代替。

    2. Enumerated

    如果属性值并不是任意的字符串,而是在几个可能的值中进行选择,如书籍的“类别”

属性,其值可为“文艺”,也可为“自然科学”,而不可能为其他情况时,则可以将书籍

的“类别”属性设定为Enumerated 型。

    3. ID

    当元素的某个属性值是不能重复时,如书籍的ISBN  属性、个人的“身份证号”属性

等,要定义这样的属性则需使用属性的ID 类型。在一个XML  文档中,所有元素的ID

类型属性的属性值必须是唯一的,不可重复,另外,一个元素不能有超过一个ID 类型的

属性。

    4. IDREF IDREFS

    IDREF Identifier Reference 的缩写,IDREF ID 类型属性的关系为子元素与父元素

的关系,即IDREF 类型属性的值必须是其他元素的ID 类型属性的值,且该ID 类型属性的

值必须在文档的其他地方被设定过。IDREFS                 类型属性的属性值可有多个,每一个都必须

是在文档其他地方被设定了的ID 类型属性的值,而这多个属性值之间用空格隔开。

  IDREFS 的使用,代码如源程序code4_10.xml 所示。

      <?xml version="1.0" encoding="gb2312"?>

      <!DOCTYPE school [

         <!ELEMENT school (teacher, subject*)>

         <!ELEMENT teacher (#PCDATA)>

         <!ELEMENT subject (#PCDATA)>

         <!ATTLIST teacher

         teach IDREFS #IMPLIED

      >

         <!ATTLIST subject

         number ID #REQUIRED

      >

      ]>

      <school>

         <teacher teach="c 0001 c 0002 c 0003">

           丁潇

      </teacher>

         <subject number="c0001">

          PowerBuilder

          </subject>

         <subject number="c0002">

          AutoCAD

          </subject>

         <subject number="c0003">

          XML

          </subject>

      </school>

5. ENTITY ENTITIES

    ENTITY  类型的属性提供了把外部二进制形式的文件(.jpeg.mp3  )和外部不可解

析实体链接到XML文档的功能。因此其属性值也必须为不可解析的链接外部实际数据的

通用实体名。ENTITIES  类型属性的属性值可由多个不可解析的外部实体名称组成,各实体

名称之间使用空格隔开。

  ENTITY ENTITIES 的使用,代码如源程序code4_11.xml 所示。

 

      <?xml version="1.0" encoding="gb2312"?>

      <!DOCTYPE customers [

         <!ELEMENT customers (customer*)>

         <!ELEMENT customer (username, password, picture)>

         <!ELEMENT username (#PCDATA)>

         <!ELEMENT password (#PCDATA)>

   <!ELEMENT picture EMPTY>

         <!ATTLIST picture pic ENTITIES #REQUIRED

      >

         <!ATTLIST customer

      ID #REQUIRED

      >

         <!ENTITY pic1 SYSTEM "a.jpg">

         <!ENTITY pic2 SYSTEM "b.jpg">

         <!ENTITY pic3 SYSTEM "c.jpg">

         <!ENTITY pic4 SYSTEM "d.jpg">

      ]>

      <customers>

         <customer ID="c0500103">

            <username>cheaperget</username>

            <password>12345678</password>

            <picture pic="pic1 pic2"/>

         </customer>

         <customer ID="c0500208">

            <username>dreamingboy</username>

            <password>22345678</password>

            <picture pic="pic3 pic4"/>

         </customer>

      </customers>

 

    本例不是所有浏览器都可以自动识别的通用格式,仅仅某些浏览器和应用程序

可能采用的在文档中嵌入非XML 数据的方法而已。

    6. NMTOKEN NMTOKENS

    NMTOKEN 类型的属性限定属性值是有效的XML 名称,这个属性值可以由英文、数

字、“.”、 _ ”、“-”、“:”等组成,这里有几点需要注意。

    (1) 不能包括空格。

    (2) 以上字符中除“:”以外,其他字符都可以作为开头字符。

    (3) :”可以出现在中间,但由于它是命名域的关键字符,所以一般不提倡使用。

    正因为NMTOKEN 类型的属性对于字符的严格要求,使得它在一些常用编程语言中,

都是合法的数据,这就为这些编程语言对XML 文档数据的操作打下了良好的基础。

    NMTOKENS 类型的属性具有与NMTOKEN 属性相近的形式。这种类型的属性可以使如

下情况合法——属性由若干XML 名称组成,彼此间由空格隔开。通常可为使用NMTOKEN

属性相同的理由而使用NMTOKENS 属性,但仅仅在需要多个名字的时候。

 

    7. NOTATION

    XML 文档中引入了外部不可解析的实体后,解析器无法解析这些二进制文件,这时,

就可以使用NOTATION类型的属性为这些二进制文件指定与其对应的应用软件以对其进

行处理。

  NOTATION  的使用,代码如下

      <?xml version="1.0" encoding="gb2312" ?>

      <!DOCTYPE customers [

           <!ELEMENT customers (customer*)>

      <!ELEMENT customer (username,password,picture)>

      <!ELEMENT username (#PCDATA)>

      <!ELEMENT password (#PCDATA)>

      <!NOTATION mspaint SYSTEM "C:/WINDOWS/system32/mspaint.exe">

      <!ELEMENT picture EMPTY>

      <!ATTLIST picture pic ENTITIES #REQUIRED>

      <!ATTLIST picture procedure NOTATION #REQUIRED>

      <!ATTLIST customer ID ID #REQUIRED>

      <!ENTITY pic1 SYSTEM "a.jpg">

      <!ENTITY pic2 SYSTEM "b.jpg">

      <!ENTITY pic3 SYSTEM "c.jpg">

      <!ENTITY pic4 SYSTEM "d.jpg">

      ]>

      <customers>

      <customer ID="c0500103" >

          <username>cheaperget</username>

          <password>12345678</password>

          <picture pic="pic1 pic2" procedure="mspaint"/>

      </customer>

      <customer ID="c0500208" >

          <username>dreamingboy</username>

          <password>22345678</password>

          <picture pic="pic3 pic4" procedure="mspaint"/>

      </customer>

      </customers>

1、 定义实体

实体的概念

  实体是包含了文档片段的虚拟存储单元,可用来存储XML  声明、DTD、其他形式的

文本及二进制数据等。简单来讲就是一段代码或数据的代称,这个代称即为实体的名字。

当需要在文档中引用某段代码或数据时,可以引用与这段代码或数据相对应的实体名称来

代替实体的具体内容。具有正确性检查功能的XML                       处理器在提交文档给最终应用程序之

前或在显示文档以前,将先把所有不同的实体引用替换为与其对应的具体内容,从而构成

一个结构完整的文档。

实体的分类

    按照实体的具体内容来分类,实体可分为可解析与不可解析两类。可解析实体的具体

内容为简单的字符、数字、文本块,而不可解析实体的具体内容则为图片、声音等二进制

文件。

按照逻辑存储来分类,实体可分为内部实体与外部实体两类。内部实体的内容是在文

档内部设定的;而外部实体则是一个外部独立的物理存储对象,如某个外部文件。

    按照使用的范围来分类,实体可分为一般实体与参数实体两类。一般实体都用来构成

文档的具体内容,可出现在XML               文档中,也可出现在DTD            中;而参数实体只能出现在

DTD 中,不能出现在XML 文档中。

    1. 内部一般实体

    内部一般实体就是在文档实体内部定义和使用的实体,其内容通常是一段文本字符。

这种实体要在DTD 中通过DTD 语句的定义,可以在XML 文档中使用,也可在DTD 中使

用。其定义的语法格式如下:

      <!ENTITY  Eentity_name  "Replacement" >

    其中,<!ENTITY>为关键字,Eentity_name 为实体名称,Replacement 为实体所代替的

文本内容。引用内部一般实体的方法如下:

      &Eentity_name;

  内部一般实体的使用,代码如下

      <?xml version="1.0" encoding="gb2312"?>

      <!DOCTYPE bookinfo [

         <!ELEMENT bookinfo (title, author, publish, price)>

         <!ELEMENT title (#PCDATA)>

         <!ELEMENT author (#PCDATA)>

         <!ELEMENT publish (publisher, ISBN, pubdate)>

         <!ELEMENT publisher (#PCDATA)>

         <!ELEMENT ISBN (#PCDATA)>

         <!ELEMENT pubdate (#PCDATA)>

         <!ELEMENT price (#PCDATA)>

         <!ENTITY thepublisher "高等教育出版社">

      ]>

      <bookinfo>

         <title>计算机导论</title>

         <author>丁跃潮等</author>

         <publish>

            <publisher> &thepublisher; </publisher>

            <ISBN>7-04-014768-8</ISBN>

            <pubdate>2004.6</pubdate>

         </publish>

         <price>19.7</price>

      </bookinfo>  

    当内部一般实体在DTD 中引用时,有以下几方面需注意。

    (1) 不能在元素及属性的声明中引用内部一般实体,如下面的语句即为非法的:

      <!ENTITY  pcd  (#PCDATA)>

      <!ELEMENT  title  &pcd;>

(2) 在语句中不能出现循环,如下面的语句即为非法的:

 

      <!ENTITY  thepub  "北大&pub;">

      <!ENTITY  pub  "出版社&thepub;">

    2. 外部一般实体

    所谓外部一般实体就是在文档实体以外定义的,要通过一个URL 才能引用到的实体。

外部一般实体为独立的文件,可被多个文档所引用。正因为每一个完整的XML                                   文档都是

一个合法的实体,所以XML 通过对外部一般实体的引用,可以在一个XML 文档中嵌入另

一个XML 文档,或者将多个文档组合成一个文档。其定义的语法格式如下:

      <!ENTITY  Eentity_name  "URL" >

    其中,URL  为引用的外部实体的URL  地址。引用外部一般实体也与引用内部一般实

体的方法一样:

      &Eentity_name;

    假如有一个XML 文档code4_14out.xml 如下:

      <?xml version="1.0" encoding="gb2312" ?>

      <publish>

            <publisher>高等教育出版社</publisher>

      <ISBN>7-04-014768-8</ISBN>

      <pubdate>2004.6</pubdate>

      </publish>

    可以通过下面的例子把它作为外部实体来引用。

   外部一般实体的使用,代码如下

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

      <!DOCTYPE bookinfo [

      <!ELEMENT bookinfo (title,author,publish,price)>

      <!ELEMENT title (#PCDATA)>

      <!ELEMENT author (#PCDATA)>

      <!ELEMENT publish (publisher,ISBN,pubdate)>

      <!ELEMENT publisher (#PCDATA)>

      <!ELEMENT ISBN (#PCDATA)>

      <!ELEMENT pubdate (#PCDATA)>

      <!ELEMENT price (#PCDATA)>

      <!ENTITY pub SYSTEM "code4_14out.xml">

      ]>

      <bookinfo>

            <title>计算机导论</title>

            <author>丁跃潮等</author>

            &pub;

            <price>19.7</price>

         </bookinfo>

    在引用外部一般实体时,有以下几方面需注意。

    (1) 因为在一个文档中需引用某些外部文件,所以该文档声明中的standalone 属性不再

是默认值yes,而应该为no

    (2) 作为外部一般实体的文档,若使用的是XML 的默认字符集即UTF-8 UNICODE

则可以在文档头部不进行XML  声明,否则,必须有XML  声明,且声明时,一定要说明

ecoding 属性。

   3. 内部参数实体

    内部参数实体是指在独立的外部DTD 文档的内部定义和使用的实体,其内容为仅能为

DTD 而非XML 文档内容的书写文本。这里提到参数实体与前面所讲的一般实体是有区

别的:

    (1) 在引用形式上,一般实体的引用为“&Eentity_name;”,而参数实体的引用则为

 “%Eentity_name;”

    (2) 在引用范围上,一般实体可在XML 文档中引用,也可在DTD  中引用,而参数实

体只可在DTD 中引用。

    定义内部参数实体的语法格式如下:

      <!ENTITY % Eentity_name "Replacement" >

  内部参数实体的使用,代码如源程序code4_15.dtd 所示。

      <?xml version="1.0" encoding="gb2312" ?>

      <!ELEMENT bookinfo (title,author,publish,price)>

      <!ELEMENT title (#PCDATA)>

      <!ELEMENT author (#PCDATA)>

      <!ENTITY % pub "(publisher,ISBN,pubdate)">

      <!ELEMENT publish %pub;>

      <!ELEMENT publisher (#PCDATA)>

      <!ELEMENT ISBN (#PCDATA)>

      <!ELEMENT pubdate (#PCDATA)>

      <!ELEMENT price (#PCDATA)>

    4. 外部参数实体

    外部参数实体是指在独立的外部DTD 文档的外部定义和使用的实体,外部参数实体用

于将多个独立的DTD 文档组合成一个大的DTD 文档。定义外部参数实体的语法格式如下:

      <!ENTITY % Eentity_name "URL" >

外部参数实体的使用,代码如下。

      <?xml version="1.0" encoding="gb2312"?>

      <!DOCTYPE bookinfo SYSTEM "code4_16_1.dtd">

      <bookinfo>

            <title>计算机导论</title>

            <author>丁跃潮等</author>

            <publish>

               <publisher>高等教育出版社</publisher>

<ISBN>7-04-014768-8</ISBN>

                <pubdate>2004.6</pubdate>

            </publish>

            <price>19.7</price>

      </bookinfo>

    程序code4_16_1.dtd

      <?xml version="1.0" encoding="gb2312"?>

      <!ELEMENT bookinfo (title,author,publish,price)>

      <!ELEMENT title (#PCDATA)>

      <!ELEMENT author (#PCDATA)>

      <!ENTITY % pub SYSTEM "code4_16_2.dtd">

      %pub;

      <!ELEMENT price (#PCDATA)>

    程序code4_16_2.dtd

      <?xml version="1.0" encoding="gb2312" ?>

      <!ELEMENT publish (publisher,ISBN,pubdate)>

      <!ELEMENT publisher (#PCDATA)>

      <!ELEMENT ISBN (#PCDATA)>

      <!ELEMENT pubdate (#PCDATA)>

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值