组团学

XML约束DTD

阅读 (522229)

一、约束概述

使用约束的原因

XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。

<person><name/><age/><area/> </person>

约束的定义

XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。

XML的格式及约束概念
格式良好的XML:遵循XML语法的XML
有效的XML:遵循约束文档的XML

​ 总之:约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。

二、常用的约束种类

1、XML DTD

2、XML Schema

三、DTD约束

定义

DTD(Document Type Definition),全称为文档类型定义。

案例演示

xml文件清单:book.xml

<?xml version="1.0" ?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <> <书名>葵花宝典</书名> <作者>东方不败</作者> <售价>59.00元</售价> </> <> <书名>九阳神功</书名> <作者>张无忌</作者> <售价>57.00元</售价> </> </书架>

book.dtd

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

注意:DTD文件应使用UTF-8或Unicode

四、DTD与XML文档关联三种方式

DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写

  • 使用内部DTD
  • 使用外部DTD
  • 使用公共DTD

4.1、在xml文件内编写DTD

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

4.2、引入外部DTD文档

XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种形式:

  • 当引用的DTD文档在本地时,采用如下方式:
<!DOCTYPE 根元素 SYSTEM “DTD文档路径”>
		如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
  • 当引用的DTD文档在公共网络上时,采用如下方式:
<!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约束语法细节

  • 元素定义
  • 属性定义
  • 实体定义

5.1、DTD-定义元素

在DTD文档中使用ELEMENT关键字来声明一个XML元素。
语法:
使用规则:
(#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)
EMPTY:用于指示元素的主体为空。比如

ANY:用于指示元素的主体内容为任意类型。
(子元素):指示元素中包含的子元素
定义子元素及描述它们的关系:
如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)
如果子元素用“|”分开,说明任选其一。
如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)
用+、*、?来表示元素出现的次数
+:表示至少出现一次,一次或多次
*:表示可有可无,零次、一次或多次
?:表示可以有也可以无,有的话只能有一次。零次或一次

元素内容的类型

image20200222182124503.png

元素(ELEMENT)定义

image20200222182238326.png

元素定义示例-----练习

image20200222182457028.png

5.2、属性(ATTLIST)定义

image20200222182720842.png

属性声明举例

对应的XML为:<商品 类别=“服装” 颜色=“黄色”/>

DTD–定义属性2

属性值类型:

​ •CDATA:表示属性的取值为普通的文本字符串

​ •ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)

​ •ID:表示属性的取值不能重复,属性的值只能由字母,下划线开始,不能出现空白字符

属性约束设置说明

​ •#REQUIRED:表示该属性必须出现

​ •#IMPLIED:表示该属性可有可无

​ •#FIXED:表示属性的取值为一个固定值。语法:#FIXED “固定值”

​ •直接值:表示属性的取值为该默认值

约束的四种形式

image20200222183209906.png

DTD–定义属性示例

	<!ATTLIST 页面作者 
	     姓名 CDATA #IMPLIED 
	     年龄 CDATA #IMPLIED 
	     联系信息 CDATA #REQUIRED 
	     网站职务 CDATA #FIXED "页面作者" 
	     个人爱好 CDATA "上网"
       > 

属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)

<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
	<!ELEMENT 肉 EMPTY>
	<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]> 
<购物篮>
	<肉 品种="鱼肉"/>
	<肉 品种="牛肉"/>
	<肉/>
</购物篮>

表示属性的设置值为一个唯一值。

ID 属性的值只能由字母,下划线开始,不能出现空白字符

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

<!DOCTYPE 联系人列表[
	<!ELEMENT 联系人列表 ANY>
	<!ELEMENT 联系人(姓名,EMAIL)>
	<!ELEMENT 姓名(#PCDATA)>
	<!ELEMENT EMAIL(#PCDATA)>
	<!ATTLIST 联系人 编号 ID #REQUIRED>
]>

<联系人列表>
	<联系人 编号=“p1">
		<姓名>张三</姓名>
		<EMAIL>zhang@it315.org</EMAIL>
     </联系人>
	<联系人 编号=“p2">
		<姓名>李四</姓名>
		<EMAIL>li@it315.org</EMAIL>
	</联系人>
</联系人列表>

5.3、实体定义

  • 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
  • 在DTD定义中,一条语句用于定义一个实体。

定义引用实体

概念:在DTD中定义,在XML中使用

语法:

引用方式(注意是在XML中使用):&实体名称;

例子:

DTD中定义:
	<!ENTITY copyright “天易IT学院版权所有”>
XML中引用:
	&copyright;

比如定义xml文档,定义person,想让里面只能出现人的一些信息,name、age,只能出现人的信息
但是xml定义的标签自定义,a、b、面积,这些内容肯定不是人的信息,所以这个时候需要对xml文档进行约束,
约束xml里面只能出现人的属性。

需要 登录 才可以提问哦