参考: 方立勋老师的讲课视频.
 
什么是XML约束
  •在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
为什么需要XML约束
常用的约束技术
  •XML DTD
  •XML Schema
DTD(Document Type Definition),全称为文档类型定义
编写DTD约束的两种方式:
  lDTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。
在xml文件内编写DTD:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
...
</书架>

  

XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式: 
•当引用的文件在本地时,采用如下方式:

<!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">

例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>。在xml文件中手写一下。

•当引用的文件是一个公共的文件时,采用如下方式: 

<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

例如:<!DOCTYPE web-app PUBLIC

"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

DTD约束语法细节

  元素定义
  属性定义
  实体定义
 
元素定义:
 
在DTD文档中使用ELEMENT声明一个XML元素,语法格式如下所示:

<!ELEMENT 元素名称 元素类型>

元素类型可以是元素内容、或类型
•如为元素内容:则需要使用()括起来,如

<!ELEMENT 书架 (书名,作者,售价)>

<!ELEMENT 书名 (#PCDATA)>

•如为元素类型,则直接书写,DTD规范定义了如下几种类型:
•EMPTY:用于定义空元素,例如<br/> <hr/>
•ANY:表示元素内容为任意类型。
 
元素内容中可以使用如下方式,描述内容的组成关系
•用逗号分隔,表示内容的出现顺序必须与声明时一致。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
• 用|分隔,表示任选其一,即多个只能出现一个

<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>

•元素内容使用空白符分隔,表示出现顺序没有要求:<!ELEMENT MYFILE (TITLE AUTHOR EMAIL)> *
l在元素内容中也可以使用+、*、?等符号表示元素出现的次数:

+: 一次或多次 (书+)

?: 0次或一次 (书?)

*: 0次或多次  (书*)

也可使用圆括号( )批量设置,例

<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

属性定义:

xml文档中的标签属性需通过ATTLIST为其设置属性
语法格式:

<!ATTLIST 元素名

属性名1 属性值类型 设置说明

属性名2 属性值类型 设置说明

……

>

属性声明举例:

<!ATTLIST 商品

类别 CDATA #REQUIRED

颜色 CDATA #IMPLIED

>

对应XML文件:

<商品 类别="服装" 颜色="黄色">…</商品>

<商品 类别="服装">…</商品>

设置说明:
•#REQUIRED:必须设置该属性
•#IMPLIED:可以设置也可以不设置
•#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。但需要为该属性提供这个值

直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。

举例:

<!ATTLIST页面作者

       姓名 CDATA #IMPLIED

       年龄 CDATA #IMPLIED

       联系信息 CDATA #REQUIRED

       网站职务 CDATA #FIXED "页面作者"

       个人爱好 CDATA "上网"

       >

  

常用属性值类型:

CDATA:表示属性值为普通文本字符串。
ENUMERATED
ID
ENTITY(实体)
 
属性值类型ENUMERATED :

属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>

  

属性值类型ID :

表示属性的设置值为一个唯一值。ID 属性的值只能由字母,下划线开始,不能出现空白字符
 
实体定义:
实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
实体可分为两种类型:引用实体和参数实体。
 
引用实体:
  引用实体主要在 XML 文档中被应用

  语法格式:
  •<!ENTITY 实体名称 “实体内容” >:直接转变成实体内容
  引用方式:

  &实体名称;

举例:
  <!ENTITY copyright “I am a programmer">

   ……

   &copyright;

  

参数实体:

参数实体被 DTD 文件自身使用
语法格式:

<!ENTITY % 实体名称 "实体内容" >

引用方式:

%实体名称;

举例1:
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">

<!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>

<!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>

  

举例2:
<!ENTITY % common.attributes

   " id ID #IMPLIED

  account CDATA #REQUIRED "

>

...

<!ATTLIST purchaseOrder %common.attributes;>

<!ATTLIST item %common.attributes;>

  

XML约束——DTD约束的更多相关文章

  1. 【JAVA与XML、dtd约束、Schema约束】

    一.XML. (1)XML:Extensible Markup Language (2)XML是一种标记语言. (3)XML的设计宗旨是传输数据,而不是显示数据. (4)XML标签没有被预定义,即使用 ...

  2. xml技术DTD约束定义

    XML约束 在XML技术中,可以编写一个文档来约束一个xml文档的书写规范,这称之为XML约束为什么需要XML约束? class.xml <stu><面积>?人怎么会有面积元素 ...

  3. XML的DTD约束

    DTD约束:DTD的声明和引用 1.内部DTD文档 <!DOCTYPE 根元素 [定义内容]> 2.外部DTD文档 <!DOCTYPE 根元素 SYSTEM "DTD文件路 ...

  4. XML内部DTD约束 Day24

    <?xml version="1.0" encoding="UTF-8"?> <!-- 内部DTD --> <!-- XML:ex ...

  5. XML、DTD约束

    XML的作用: xml现在主要用于配置文件 文档声明: 如果你使用记事本打开文档,此时如果记事本默认保存数据到硬盘根据的是"GB2312"编码,这个时候如果你在xml文档源码中en ...

  6. XML学习1 xml序言 dtd约束

  7. 2.xml约束技术----------dtd约束

    1.xml的约束 (1)为什么需要定义约束了 比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name age等,但是如果在xml文件中写了一个元素<猫>,发 ...

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

    一.XML文件简介 关于XML的大多数人都知道一些,HTML->xhtml->xml,这个顺序本来应当是HTML发展的顺序. XML可以当做配置文件使用,还可以充当小型的数据库. vers ...

  9. 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 ...

随机推荐

  1. Add baidu map in your website (wordpress)

    手动挡 访问应用(AK)Key http://lbsyun.baidu.com/apiconsole/key Basic Map Generator http://api.map.baidu.com/ ...

  2. 内存映射MMAP和DMA【转】

    转自:http://blog.csdn.net/zhoudengqing/article/details/41654293 版权声明:本文为博主原创文章,未经博主允许不得转载. 这一章介绍Linux内 ...

  3. ThinkPHP跳转与重定向的区别在哪里

    跳转: 浏览器认为 : 当前 URL 请求成功 , 重新请求新的 URL . 浏览器会记录当前的 URL 和新的 URL 在请求历史记录中. 回退, 是可以回退到 , 当前的 URL 上的 . ( 无 ...

  4. 【PHP设计模式 10_ShiPeiQi.php】适配器模式

    <?php /** * [适配器模式] * 对于服务器的代码,需要不同的客户端都可以调用 * 也可能是新的程序员要修改以前程序员写的老代码 */ header("Content-typ ...

  5. memcache缓存的使用

    今天在,本地测试了一个关于memcache的demo. 本地集成环境(wamp)环境如下:php 5.5.12  .Apache 2.4.9 .mysql 5.6.17 1.除了添加配置.添加php的 ...

  6. HDU 2136:Computer(树形DP)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 Computer     Description A school bought the fi ...

  7. [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...

  8. Dual Core CPU

    Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 20935 Accepted: 9054 Case ...

  9. 转载-python学习笔记之输入输出功能读取和写入数据

    读取.写入和 Python 在 “探索 Python” 系列以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如tuple.string 和 list.其他文章讨论了 Pytho ...

  10. centos 6.5源码编译安装subversion 1.8.10

    一.简介 CentOS 6.5的yum源可以安装的SVN客户端版本太低了,1.6.11,所以需要升级到1.8.10,而官网有没有找到1.8.10的安装包,只能选择源码编译安装. 二.安装步骤 参考官网 ...