XML基础知识点2—DTD

文档类型定义(DTD)可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构。可以看做是XML文档的数据结构,可以形成一种可靠的错误监测机制,程序员或解析器可以由此查找可能的错误。如果不指定DTD,程序可以运行(XML可以被解析),但是你无法确定XML中的数据是完全符合要求的。有时候,不正确的数据会导致莫名其妙的错误。

具体的可参考DTD教程

如下实例:

 1 <?xml version="1.0"?>
 2 <!DOCTYPE note [
 3   <!ELEMENT note (to,from,heading,body)>
 4   <!ELEMENT to      (#PCDATA)>
 5   <!ELEMENT from    (#PCDATA)>
 6   <!ELEMENT heading (#PCDATA)>
 7   <!ELEMENT body    (#PCDATA)>
 8 ]>
 9 <note>
10   <to>George</to>
11   <from>John</from>
12   <heading>Reminder</heading>
13   <body>Don‘t forget the meeting!</body>
14 </note>

以上 DTD 解释如下:

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。

!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading、body"

!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型

!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型

!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型

!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

注意:当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。

元素的数据类型有:

#CDATA:(Character Data)指元素包含不通过解析器解析的字符数据。特殊字符和保留字不需要转义。
#PCDATA: (Parsed CDATA)指元素包括解析器可解析字符数据。特殊字符和保留字需要转义才可以通过解析器。
ANY:元素可以包含任何声明类型的子元素和字符数据。

如果是空元素如<note></note>或者<note/>则定义如下:

<!ELEMENT note EMPTY>

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中,如下所示:

1 <?xml version="1.0"?>
2 <!DOCTYPE note SYSTEM "note.dtd">
3 <note>
4 <to>George</to>
5 <from>John</from>
6 <heading>Reminder</heading>
7 <body>Don‘t forget the meeting!</body>
8 </note> 

这是包含 DTD 的 "note.dtd" 文件:

1 <!ELEMENT note (to,from,heading,body)>
2 <!ELEMENT to (#PCDATA)>
3 <!ELEMENT from (#PCDATA)>
4 <!ELEMENT heading (#PCDATA)>
5 <!ELEMENT body (#PCDATA)>

DTD声明中还可以控制元素出现的次数及多个选项,如下所示:

<!ELEMENT team (people+,name*,gender?,(message|body))>

team表示只出现1次,people+表示至少出现1次,name*表示出现0次或者多次,gender?表示出现0次或者1次,(message|body)表示message和body元素任选1个。

除了可以声明元素外,还可以声明属性,格式为:<!ATTLIST 元素名称 属性名称 属性类型 默认值>

如下所示:

 1 <?xml version="1.0"?>
 2 <!DOCTYPE team [
 3     <!ELEMENT  team (people+)>
 4     <!ELEMENT people (name,gender)>
 5     <!ELEMENT name (#CDATA)>
 6     <!ELEMENT gender (#CDATA)>
 7     <!ATTLIST people type CDATA "employee">
 8 ]>
 9
10 <team>
11     <people type="employee">
12        <name>zhangsan</name>
13        <gender>f</gender>
14     </people>
15     <people type="leader">
16        <name>lisi</name>
17        <gender>m</gender>
18     </people>
19 </team>

其中属性类型的选项如下:

类型 描述
CDATA 值为字符数据
(en1|en2|...) 此值是枚举列表中的一个值
ID 值为唯一的id
IDREF 值为另外一个元素的id
IDREFS 值为其他id的列表
NMTOKEN 值为合法的 XML 名称
NMTOLENS 值为合法的 XML 名称的列表
ENTITY 值为一个实体
ENTITIES 值为一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的xml值

默认值参数可使用下列值:

描述
属性的默认值
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的

外部实体引用的例子如下所示:

people1.xml

<?xml version="1.0"?>
<people id="1">
    <name>zhangsan</name>
    <gender>f</gender>
</people>

people2.xml

1 <?xml version="1.0"?>
2 <people id="2">
3     <name>lisi</name>
4     <gender>m</gender>
5 </people>

team.xml

1 <?xml version="1.0"?>
2 <!DOCTYPE team [
3     <!ENTITY people1 SYSTEM "./people1.xml">
4     <!ENTITY people2 SYSTEM "./people2.xml">
5 ]>
6 <team>
7     &people1;
8     &people2;
9 </team>

最后形成的xml文档如下:

 1 <?xml version="1.0"?>
 2 <team>
 3     <people id="1">
 4         <name>zhangsan</name>
 5         <gender>m</gender>
 6     </people>
 7     <people id="2">
 8         <name>lisi</name>
 9         <gender>f</gender>
10     </people>
11 </team>    

注意:由于外部实体存在注入漏洞,因为xml解析器会以当前上下文的环境引用外部资源作为实体的内容,从而在实际的应用上下文里将该部分数据引入逻辑流程进行处理。所以目前有些解析器不会解析外部实体。最好检查所使用的底层xml解析库,默认禁止外部实体的解析,同时增强对系统的监控,防止此问题被人利用。

时间: 2024-11-02 16:44:53

XML基础知识点2—DTD的相关文章

XML基础知识

1.XML基础2.XML语法3.XML DOM4.Javascript解析XML文档 1.XML基础eXtensible Markup Language 可扩展标记语言XML是一种平台无关的用于携带和传送数据的方法. ~~~~xml主要是描述数据是什么,一般没有数据如何呈现的信息,有别于HTML,HTML可以说是xml的一种实现.(注:xhtml才是xml的一种实现) xml文档可以用IE 文本编辑器或者专门的XML编辑器浏览 ~~~xml不同平台的数据交换,但不适合大批量数据的存储与处理(有别

XML基础以及用DOM4j读取数据

都知道,HTML被设计用来显示数据,XML被设计用来保存.传输数据.而我们平时经常用的无非是保存数据.读取数据.所以这里主要介绍XML相关基础内容,以及用DOM4j来存取XML的数据. 下面简介XML相关的基础内容--命名空间.XSL.DTD与Schema 1>基本结构 ------------------------- ?  <>成对,区分大小写 ?  顶层元素只能有一个 ?  元素不能以xml开头,且不能有空格 2>命名空间 与我们编程语言中的命名空间类似,例如,如果想要建立两

Spring4.x 基础知识点

# Spring4.x 基础知识点## 第二章 快速入门- 一般情况下,需要在业务模块包下进一步按分层模块划分子包,如user\dao.user\service.viewspace\dao.viewspace\service等.对于由若干独立子系统组成的大型应用,在业务分层包前还需要加上子系统的前缀.包的规划对于大型应用非常重要,它直接关系到应用部署和分发的便利性.- 在配置文件的定义上,一般也是按模块进行划分,一定程度上降低争用.- 在拼接SQL语句的句前和句后都加一个空格,这样避免分行SQL

JavaEE XML 基础知识

JavaEE XML 基础知识 @author ixenos 1.    XML开头都需要一个声明 <?和?>表明这是一个处理指令 <?xml version=”1.0” encoding=”UTF-8” ?> 2.    <book id=”1.0”> </book> 等同于: <book> <id>1.0</id> </book> 3.    XML格式能够表达层次结构(树),并且重复的元素不会被曲解 4.

xml基础知识的学习

xml基础知识学习: xml的特点:xml与操作系统.编程语言的开发平台都无关 实现不同系统之间的数据交互 xml:可扩展标记语言 html: xml结构:   <?xml version ="1.0" encoding ="UTF-8" ?> --xml文件的声明encoding 不写默认为UTF-8 <根元素>     <子元素1 属性="value">         <元素>值</元素

http常见基础知识点

引言:作为web开发人员,吃透http是很有必要的,下面是我对http协议的基本常用知识点总结. http简介 简单来说,http(HyperText Transfer Protocol,超文本传输)协议就是用于客户端和服务器端之间的通信协议. 用送信来类比,客户端就是写信人,服务器端是收信人,而http协议就是邮寄规则,他保障你写的信能被收到. HTTP协议工作于客户端-服务端架构为上.浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求.Web服务器根据接收到的请求后

XML基础+Java解析XML +几种解析方式的性能比较

XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数据,其焦点是数据的内容. HTML 被设计用来展示数据,其焦点是数据的外观. HTML可以不关闭标签(即标签可以不成对出现),但XML必须关闭标签(即标签必须成对出现). HTML中的标签标识文本如何展示,而XML中的标签标识文本是什么含义(什么类型的文本). XML文档节点类型 u     文档(

Java web基础总结一之—— xml基础

Java web基础总结之一--xml基础 要学习java web,掌握xml语言是必要的,可以说,在一个java web项目中,xml配置文件无处不在.首先每个java web项目都会有一个web.xml的配置文件.而在各种各样的框架中,xml配置文件更是必不可少.当然,虽然有些框架可以使用注解来实现零配置.但是一般还是习惯于使用配置文件,可以和代码解耦和. 一.Xml基础知识以及语法规范 那首先的问题是,什么是xml?它主要用来做什么? Xml是Extensible Markup Langu

XML基础&lt;第一篇&gt;

一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基础: <?xml version="1.0" encoding="utf-8" ?> <books ISBN="9787544238212"> <title>xml学习笔记</title> <pr