XML(二)之DTD——XML文件约束
前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束。废话不多说,我们直接来正题!
一、DTD简介
1.1、DTD概述
DTD(Document Type Definition,文档类型定义)
1)DTD是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。
2)XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,
各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
4)DTD中的所有约束都是针对 与某个标签的子标签进行约束的
注意:除了DTD约束,其实还有其他的约束。Schema(模式)约束:用xml写的文件,然后用来约束xml文件
1.2、DTD的目的
验证XML文档是不是一个有效的XML文档。
有效:如果一个良构的XML文档满足了dtd的声明,就是一个有效的XML文档。
有效一定良构,良构不一定有效。
1.3、XML文档引入DTD的方式
1)引入内部DTD
<!DOCTYPE 根元素[
DTD验证规则/实体定义...
]>
2)引入外部DTD
当引用的文件在本地时:<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
当引用文件是一个公共文件(DTD文件存在于远程服务器上)时:<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">
1.4、DTD约束原理
注:通过DTD约束,XML就能在DTD的约束下进行自定义了,不过DTD有个缺点,那就是不能对数据进行数值约束这种范围约束。
二、DTD的分类
2.1、内部DTD
DTD代码与XML代码在同一个文件中
例如:带有DTD的XML文档实例
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
分析:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型
2.2、外部DTD
DTD约束与xml文档不在同一个文件中,XML文档需引入外部DTD文件
例如:外部DTD实例,需要将DTD文件引入到XML文件中
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
note.dtd文件的内容
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
2.3、混合DTD
既有外部DTD,又有内部DTD
三、DTD在元素中的声明
3.1、元素约束
格式:<!ELEMENT 元素名 (内容模式)> 同一元素不允许出现两次声明
1)内容模式:可以对元素内容进行约束也可以对元素中的子元素进行约束,大小写敏感,内容模式的括号有意义
1.1)(#PCDATA) :元素内容为任何字符或者空,但不允许有子元素, 不可省略()
1.2)EMPTY :元素内容为空,不允许有任何文本数据(包括空格换行)与子元素,可以有属性,不可加()
1.3)ANY :元素可以包含任何数据,包括文本数据和子元素,不可加()
<!--.EMPTY:指的是该标签中不能有其他任何的子标签-->
<!-- <!ELEMENT students EMPTY> --> <!-- .(#PCDATA:表示在该标签中只能出现字符内容,不能出现任何的标签) -->
<!-- <!ELEMENT students (#PCDATA)> --> <!--.ANY:表示在该标签中可以出现任何数据 -->
<!-- <!ELEMENT students ANY> -->
<students>
</students>
1.4)(childElements) 由内容模式部件指定:“, | ? + *”
对内部子元素进行约束,均不能添加其他子元素以及文本(可以空格换行)
“,”:表示指定子元素必须顺序出现,不多不少
例如:<!ELEMENT EleName (a,b,c)>
解读:<!-- 表示a、b、c三个元素按照顺序并且每个只能出现一次 -->
“|”:表示在指定的多个子元素中选择出现1个,只能1次
例如:<!ELEMENT EleName (a|b|c)>
解读:<!-- 表示a、b、c三个元素任选其一只能出现一次 -->
“ ”:元素必须且只能出现一次
例如:<!ELEMENT EleName (a)>
解读:<!-- 表示a必须出现并且只能出现一次 -->
“?”:指定元素要出现0次或1次
例如:<!ELEMENT EleName (a)?>
解读:<!-- 表示a能够出现0次或1次 -->
“+”:指定元素要出现1次或多次
例如:<!ELEMENT EleName (a)+>
解读:<!-- 表示a能够出现1次或多次 -->
“*”:指定元素要出现0次或多次
例如:<!ELEMENT EleName (a)*>
解读:<!-- 表示a能够出现0次或多次 -->
2)混合模式(Mixed)
元素中既可有文本数据又可有子元素
<!ELEMENT EleName (#PCDATA|a|b)*>
表示元素中即可以有字符又可以有指定元素,字符数据与指定元素可以出现任意次数,顺序不限。
注意:优先写#PCDATA,如(#PCDATA|a)*正确,(a|#PCDATA)*错误。
浏览器是非验证解析器,不会校验xml文档的有效性。
3.2、属性约束
1)语法:
<!ATTLIST 元素名 属性名 属性类型 属性默认值
属性名 属性类型 属性默认值
......
>
2)属性类型
ID 属性值唯一,且属性值必须符合命名规则——不能以数字开头
(v1|v2|v3) 枚举,属性值从中选择一个
CDATA 属性值为字符
3)属性默认值
#REQUIRED 属性必须出现,属性值没有限制
#IMPLIED 属性值可以出现可以不出现
attribute_vlaue 属性类型后跟属性值,表示属性如果不出现,则属性值为默认的attribute_value
#FIXED value #FIXED value表示属性可出现可不出现,显示出现则属性值必须为指定的value,不出现,则值默认value
注:ID属性类型只能使用#REQUIRED或#IMPLIED;枚举类型后跟默认值必须为匹配值之一
四、DTD文档的实例
4.1、内嵌
<!DOCTYPE 根元素[
<!ENTITY 实体名 "实体内容">
<!ELEMENT 元素名 (内部模式)>
<!ATTLIST 元素名 属性名 属性类型 属性默认值/属性特点
属性名 属性类型 属性默认值/属性特点
...
>
]>
4.2、外部引用
<!DOCTYPE 根元素 SYSTEM "dtd文件路径">
<!DOCTYPE 根元素 PUBLIC "dtd文件的描述信息" "dtd的url">
4.3、内嵌与外部引用同时使用
<!DOCTYPE 根元素 SYSTEM "dtd文件路径" [
<!ENTITY 实体名 "实体内容">
<!ELEMENT 元素名 (内部模式)>
<!ATTLIST 元素名 属性名 属性类型 属性默认值
属性名 属性类型 属性默认值
...
>
]>
一个实例:班级约束
XMLClass.dtd
<!ENTITY % sex "男|女">
<!ELEMENT 班级 (学生+,作者)>
<!ATTLIST 班级
班次 CDATA "1班"
编号 ID #REQUIRED
>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 作者 (#PCDATA)>
<!ATTLIST 学生
地址 CDATA #IMPLIED
授课方式 CDATA #FIXED "面授"
学号 ID #REQUIRED
班级编号 IDREF #REQUIRED
朋友 IDREFS #IMPLIED
性别 (%sex;) #REQUIRED
>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
XMLClass.dtd
XMLtest.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入DTD -->
<!DOCTYPE 班级 SYSTEM "XMLClass.dtd"
[<!ENTITY writer "Switch">]>
<班级 编号="C1" 班次="1班">
<学生 地址="湖南" 授课方式="面授" 学号="n1" 班级编号="C1" 朋友="n2" 性别="男">
<名字>张三</名字>
<年龄></年龄>
<介绍>不错</介绍>
</学生>
<学生 授课方式="面授" 学号="n2" 班级编号="C1" 朋友="n1 n3" 性别="女">
<名字>李四</名字>
<年龄></年龄>
<介绍>很好</介绍>
</学生>
<学生 授课方式="面授" 学号="n3" 班级编号="C1" 朋友="n2" 性别="男">
<名字>王五</名字>
<年龄></年龄>
<介绍>非常好</介绍>
</学生>
<作者>&writer;</作者>
</班级>
觉得不错的点个推荐“”哦!
XML(二)之DTD——XML文件约束的更多相关文章
- xml初步,DTD和Schema约束
XML 可扩展的标记语言(!!!可扩展) 作用 1.存放数据 2.配置文件 语法 文档声明 <?xml version="1.0" encoding="UTF-8& ...
- 用javascript操作xml(二)JavaScript 将XML转换成字符串(xml to string)
function xmlToString(xmlData) { var xmlString; //IE if (window.ActiveXObject){ xmlString = xmlData.x ...
- xml语法、DTD约束xml、Schema约束xml、DOM解析xml
今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...
- XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...
- 自定义xml配置文件之dtd文件校验
用了很多第三方库,也看了些源码,总是想如果自己写一个类似的库,读取xml配置文件(properties配置文件比较简单) 该如何给配置文件添加头,添加校验,因为xml配置文件相对于properties ...
- Hibernate映射文件详解(News***.hbm.xml)二
转自 http://blog.csdn.net/a9529lty/article/details/6454924 一.hibernate映射文件的作用: Hibernate映射文件是Hibernate ...
- XML引入多scheme文件约束简单示例
XML引入多scheme文件约束简单示例,用company.xsd和department.xsd来约束company.xml: company.xsd <?xml version="1 ...
- XML学习笔记(二)-- DTD格式规范
标签(空格分隔): 学习笔记 XML的一个主要目的是允许应用程序之间自由交换结构化的数据,因此要求XML文档具有一致的结构.业务逻辑和规则.可以定义一种模式来定义XML文档的结构,并借此验证XML文档 ...
- XML文件基础,DTD校验文件编写,Schema文件的简单使用
dtd <!-- <!ELEMENT 元素(子元素,...)> --> <!ELEMENT students (student+,cat*) > <!ELEM ...
随机推荐
- java的引用数据类型,你知道吗???
有些人很清楚java的八种基本数据类型,但说到java的引用数据类型就不清楚了. Java的数据类型分为两大类,即基本数据类型和引用数据类型,在基本数据类型中有8种 基本数据类型(逻辑型-boolea ...
- 2_linux 常用基本命令
相信当你看到此帖子时,你已不再是当年那个颓废的你,你一定也在追梦的路上奔跑,那么请留下你的“梦”,让我们用心去交流,好吗? 废话不多说,直接说正事! 一.查看磁盘分区 1.fdisk -l 查看磁盘 ...
- mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作
一.首先说下本篇博客所实现功能的背景和功能是怎样的: 背景:因为公司项目开始迁移新平台项目,所以以前的平台老数据以及订单信息需要拆分表,而且需要业务逻辑来分析以前的订单表,来拆分成另外的几个新表,包括 ...
- JavaScrpt笔记之第三天
1.JavaScriot代码规范 代码规范通常包括以下几个方面: 变量和函数的命名规则 空格,缩进,注释的使用规则. 其他常用规范-- 规范的代码可以更易于阅读与维护. 2.命名规则 一般很多代码语言 ...
- for 循环语句
for循环写在<script></script>里面. for(初始条件:循环条件:状态改变){循环内容} 关键词:break:结束此次循环,continue:跳过此次循环,继 ...
- POI实现excel各种验证和导入的思路总结
制定标准 导入总是与导出相辅相成的,无规矩不成方圆.所谓的标准都是大家一同来维护和遵守的,那么首先就是制定一个模板. 这样可以减少验证的工作量. 例如时间的规范[yyyy-MM-dd],获取单元格 ...
- oracle语句批处理
数据量有40万条,从一个对象table_01一条一条取数到对象table_02,如果用原始的 Statement Statmt =comm.createStatement(); String sql= ...
- ORACLE分区表、分区索引详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt160 ORACLE分区表.分区索引ORACLE对于分区表方式其实就是将表分段 ...
- [转]RMI方式Ehcache集群的源码分析
RMI方式Ehcache集群的源码分析 Ehcache不仅支持基本的内存缓存,还支持多种方式将本地内存中的缓存同步到其他使用Ehcache的服务器中,形成集群.如下图所示: Ehcache支持 ...
- MPLS LDP随堂笔记1
LDP 的使用原因(对于不同协议来说) LDP的四大功能 发现邻居 hello 5s 15s 224.0.0.2 发现邻居关系 R1 UDP 646端口 R2 UDP 646端口 此时形成邻居 建立邻 ...