关于XML的DTD概述

1 DTD概述

1.1 什么是DTD

DTD(Document Type Definition),文档类型定义,用来约束XML文档。或者可以把DTD理解为创建XML文档的结构!例如可以用DTD要求XML文档的根元素名为<students>,<students>中可以有1~N个<student>,<student>子元素为<name>、<age>和<sex>,<student>元素还有number属性。

DTD不是XML文档,它是XML文档的约束文件!就像法律与人一样!

展示DTD文档

<!ELEMENT students (student+)> 定义元素students,其内容为1~N个student元素。
<!ELEMENT student (name,age,sex)> 定义元素student,内容依次为name、age、sex元素
<!ELEMENT name (#PCDATA)> 定义元素name,内容为文本
<!ELEMENT age (#PCDATA)> 定义元素age,内容为文本
<!ELEMENT sex (#PCDATA)> 定义元素sex,内容为文本

1.2 DTD分类

l  内部DTD:在XML文档内部嵌入DTD,只对当前XML文档有效;

l  外部DTD:独立的DTD文件,扩展名为.dtd;

  • 本地DTD:DTD文件在本地,不在网络上。自己项目,或本公司内部使用的;
  • 公共DTD:DTD文件在网络上,不在本地。都是大公司或组织发布的,共大家使用!

1.3 内部DTD

<!DOCTYPE 根元素名称[

DTD内容

]>

内部DTD:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE students [
<!ELEMENT students (student+)>
<!ELEMENT student (name, age, sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
]>
<students>
    <student>
        <name>zhangSan</name>
        <age>23</age>
        <sex>male</sex>
    </student>
</students>

l  位置:内部DTD在文档声明下面,在根元素上面;

l  语法格式:放到“<!DOCTYPE 根元素名称 [”和“]>”之间;

l  只对当前XML文档有效;

<!DOCTYPE students[

DTD约束内容

]>

1.4 SYSTEM DTD

<!DOCTYPE 根元素名称 SYSTEM “xxx.dtd”>

本地DTD

<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE students SYSTEM "students.dtd "> dtd文件路径
<students>
    <student>
        <name>zhangSan</name>
        <age>23</age>
        <sex>male</sex>
    </student>
</students>

students.dtd

<!ELEMENT students (student+)>
<!ELEMENT student (name, age, sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>

l  位置:本地硬盘上;

l  语法格式:直接定义元素或属性即可;

l  本地所有XML文档都可以引用这个dtd文件;

<!DOCTYPE 根元素名称 SYSTEM “dtd路径”>

1.5       公共DTD

<!DOCTYPE students PUBLIC “描述信息例如:版本作者语言等等” “网络上DTD的路径”>

<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE students PUBLIC "-//qdmmy6//DTD ST 1.0//ZH" "http://www.qdmmy6.com/xml/dtds/st.dtd">
<students>
    <student>
        <name>zhangSan</name>
        <age>23</age>
        <sex>male</sex>
    </student>
</students>

<!DOCTYPE 根元素名称 PUBLIC “信息” “位置”>

公共DTD是说,DTD由某个公司或权威组织发布的,供大家使用的DTD。其格式如下:

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD网址">

当然你需要知道要使用的DTD的名称和网址。如果某个机构公布了DTD,那么一定也会公布DTD的名称和网址。

2 DTD语法之定义元素(了解)

2.1 定义元素语法

定义元素语法:<!ELEMENT 元素名 元素描述>

l  <!ELEMENT name (#PCDATA)>,定义名为name的元素,内容为文本类型。

l  <!ELEMENT student (name,age,sex)>,定义名为student元素,内容依次为name、age、sex元素;

l  <!ELEMENT student ANY>,定义名为student元素,内容任意;

l  <!ELEMENT student EMPTY>,定义名为student元素,不能有内容,即空元素,注意空元素是可以有属性的。<student  />

2.2 子元素出现次数

可以使用*、+、?来指定子元素出现的次数

*:可以出现0~N次;

l  +:可以出现1~N次;

l  ?:可以出现0~1次。

例如:<!ELEMENT student(name,age?,hobby*,grade+) >,定义student元素,第一子元素为name,必须且仅能出现一次,age是可有可无的,hobby可以出现0~N次,grade可以出现1~N次。

2.3 枚举类型子元素

<!ELEMENT student (name | age | sex)>,表示student子元素为name、age、sex其中之一,必须仅且能选择其一。<!ELEMENT men (wife|girlfriend)*>

2.4 练习

l  根元素为students,可以包含1~N个student元素;

l  student元素依次包含:name、age、sex元素;

l  name、age、sex元素的内容类型为文本内容;

l  要求SYSTEM外部DTD。

3 DTD语法之定义属性

3.1 定义属性的语法

<!ATTLIST 元素名 属性名 属性类型 设置说明>

例如:<!ATTLIST student number CDATA #REQUIRED>,给student元素定义属性number,类型为文本,这个默认是必须的。

3.2 属性设置说明

l  #REQUIRED:说明属性是必须的;

l  #IMPLIED:说明属性是可选的;

l  默认值:在不给出属性值时,使用默认值。

3.3 属性的类型

l  CDATA:文本类型;

l  Enumerated:枚举类型;

l  ID:ID类型,ID类型的属性用来标识元素的唯一性,即元素的ID属性值不能与其他元素的ID属性值相同;

l  IDREF:ID引用类型,用来指定另一个元素,与另一个元素建立关联关系,IDREF类型的属性值必须是另一个元素的ID。

<!ELEMENT students (student+) > 定义students,可以包含1~N个student元素
<!ELEMENT student EMPTY> 定义student元素,该元素为空元素,即不能有元素体
<!ATTLIST student number ID #REQUIRED> 为student定义属性number,类型为ID,该属性是必须出现的。
<!ATTLIST student name CDATA #REQUIRED> 为student定义属性name,类型为字符串,该属性是必须的。
<!ATTLIST student sex (male | female) "male" > 为student定义属性sex,类型为枚举,可选值为male或female,默认值为male
<!ATTLIST student friend IDREF #IMPLIED>  为student定义属性friend,类型为IDREF,该属性是可选的。
<?xml version="1.0" ?>
<!DOCTYPE students SYSTEM "students.dtd">

<students>
    <student number="itcast_001" name="zhangSan"/>
    <student number="itcast_002" name="liSi" sex="male"/>
    <student number="itcast_003" name="wangWu" sex="female" friend="itcast_002"/>
</students> 
4 DTD语法之定义实体(了解)

4.1 什么是实体

有时在XML中会出现很多相同的内容,例如“北京传智播客教育科技有限公司”,这个名称太长了,我们希望把这个值与一个“符号”绑定,然后在需要这个名称时使用它绑定的“符号”即可。这个符号就是实体了。例如:“&传智;”!

其中“传智”是实体名,而“北京传智播客教育科技有限公司”是实体值,XML被解析时,所有实体会被替换成实体名。

4.2 实体分类(了解)

实体分为两种:一般实体和参数实体。

l  一般实体:在XML文档中使用;

l  参数实体:在DTD使用。

4.3 一般实体(了解)

l  定义一般实体:<!ENTITY 实体名 “实体值”>,例如:<!ENTITY 大美女 “白冰”>;

l  一般实体引用:&实体名;,例如<xxx>&大美女;</xxx>。

<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE students SYSTEM "a.dtd">

<students>
    <student number="itcast_001" name="zhangSan"/>
    <student number="itcast_002" name="liSi" sex="male"/>
    <student number="itcast_003" name="wangWu" sex="female" friend="itcast_002"/>
    <student number="itcast_004" name="&itcast;" />引用一般实体
</students>
<!ELEMENT students (student+) >
<!ELEMENT student EMPTY>
<!ATTLIST student number ID #REQUIRED>
<!ATTLIST student name CDATA #REQUIRED>
<!ATTLIST student sex (male | female) "male">
<!ATTLIST student friend IDREF #IMPLIED>
<!ENTITY itcast "北京传智播客教育科技有限公司"> 定义一般实体

4.4 参数实体(了解)

l  定义参数实体:<!ENTITY % 实体名 "实体值">,“%”与实体名之间的空格是必须的;

  • 例如:<!ENTITY % friend "student friend IDREF #IMPLIED">

l  参数实体引用:%实体名;;

  • 例如:<!ATTLIST %friend;>

参数实体是在DTD内部使用,而不是在XML中使用。

在内部DTD中使用参数实体会有诸多限制。

<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE students SYSTEM "a.dtd">

<students>
    <student number="itcast_001" name="zhangSan"/>
    <student number="itcast_002" name="liSi" sex="male"/>
    <student number="itcast_003" name="wangWu" sex="female" friend="itcast_002"/>
    <student number="itcast_004" name="&itcast;"/>
</students>
<!ELEMENT students (student+) >
<!ELEMENT student EMPTY>
<!ATTLIST student number ID #REQUIRED>
<!ATTLIST student name CDATA #REQUIRED>
<!ATTLIST student sex (male | female) "male">
<!ENTITY % friend "<!ATTLIST student friend IDREF #IMPLIED>"> 定义参数实体
%friend; 参数实体引用
<!ENTITY itcast "北京传智播客教育科技有限公司">
时间: 2024-11-09 01:59:18

关于XML的DTD概述的相关文章

【PHP XML与dtd概述【完整版】】

一.XML文件简介 关于XML的大多数人都知道一些,HTML->xhtml->xml,这个顺序本来应当是HTML发展的顺序. XML可以当做配置文件使用,还可以充当小型的数据库. version:文档符合xml1.0规范,我们学习的一般都是1.0encoding:文档字符编码,比如gb2312,一般使用utf-8standalone:文档定义是否独立使用standalone="yes",表名文档独立使用standalone="no":默认 XML文档有且

XML之------DTD(文档类型定义)

一.DTD概述 1.XML文档是一种元标记语言,即一种定义标记语言的语言.在XML中可以创建新的标记语言,这些新的标记语言(也叫标记集)要通过文档类型定义(Document Type Definitions,DTD)来定义. 2.DTD文档是这些新的标记语言的法律性文档.如果XML文档的语法符合DTD的定义和规定,那么就称为一个合法的XML文档,否则就是非法的XML文档. 二.DTD的作用 DTD定义了文档的逻辑结构,规定了文档中所使用的元素.实体.元素的属性.元素与实体之间的关系. 1.使用D

xml文档概述

xml-不能描述页面的排版和表现形式,只是用于描述数据和数据结构. 格式要求:开始标签和结束标签必须配套. 空元素标签采用(/)来关闭. 标签区分大小写.   合理嵌套. 必须用双引号或单引号括起所有的属性. 只能有一个根元素. xml-文档声明 <?xml version="1.0" encoding="utf-8" standalone="no"?> version-版本号是1.0,encoding-字符编码集, standalo

XML与DTD(够用)

1: 概述 1.1 什么是XML 1.2 三个重点 1.3规则 1.4 常用转义 2: Xml声明 XML 中,空格会被保留 XML 以 LF 存储换行 3:Xml标签 4:Xml元素 5:XML 属性 6:验证XML 7:最佳命名习惯 8:XML进阶 1: 概述 1.1 什么是XML XML指可扩展标记语言.它是从标准通用标记语言派生的基于文本的标记语言(SGML). 1.2 三个重点 XML是可扩展的: XML允许你创建自己的自描述性的标签,或语言,适合您的应用程序. XML进行数据 : 不

理清XML,HTML,DTD,Schema,户阿由

其实我是很厉害的段子手,吹逼高手.很久很久以前,有一次,在那个那个地方...(啪)卢本伟闭嘴==! 1.HTML和XML没啥关系,XML和DTD,Schema比较亲近. 2.HTML是显示数据.XML是传输存储数据.(至于定义什么的自己去搜着看,我主要是了解他们干嘛的.) 3.DTD是一种语法规则,它用来规则XML文档怎么怎么写. 4.Schema就牛逼了,基于XML,只是功能比DTD更丰富,但是最最根本的目标,和DTD一样,为了让XML更方便写,传输存储处理数据上功能更强大. 5.DTD和Sc

jdom dom4j解析xml不对dtd doctype进行验证(转)

一.写在所有之前:因为dom4j和jdom在这个问题上处理的方法是一模一样的,只是一个是SAXBuilder 一个SAXReader,这里以jdom距离,至于dom4j只需要同理替换一下就可以了.二.问题发生的情况当你用jdom读取一个有dtd验证的xml文件,同时你的网络是不通的情况下.会出现以下错误:1,代码如下 package dom;import java.io.File;import org.jdom.Document;import org.jdom.input.SAXBuilder;

xml约束DTD演示

此演示xml和DTD在一个文件中 book.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> &

XML之DTD(2)

接上一篇<XML之DTD(1)>        DTD实体       实体是用于定义引用普通文本或特殊字符的快捷方式的变量. 实体引用是对实体的引用. 实体可在内部或外部进行声明. 一个内部实体声明:          语法: <!ENTITY 实体名称 "实体的值"> DTD例子: <!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3Sch

javaee之xml和dtd的基础练习

从昨天的学习中,我学习到了xml的基础知识,包括dtd的约束基础 一.首先 是关于dtd的联系,关于这部分我们知识需要了解能够根据dtd约束来写出xml文件即可 1)首先是dtd文件: <!ELEMENT TVSCHEDULE (CHANNEL+)> <!ELEMENT CHANNEL (BANNER,DAY+)> <!ELEMENT BANNER (#PCDATA)> <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>