XML语言以及DTD的详解(方立勋javaweb)

XML语言以及DTD的详解

  • xml语言

  1. 什么是XML?

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签
  • XML 被设计为具有自我描述性
  • XML 是 W3C 的推荐标准

 

  1. XML技术用于解决什么问题?

(1)XML是一种通用的数据交换格式。
(2)在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在起始标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述

例如:

 

  1. XML的常见应用

XML技术用于保存有关系的数据之外,它还常用作软件配置文件,以描述程序模块之间的关系(如Struts、Spring、Hibernate等都是基于XML作为配置文件的)。

在一个软件系统中,通过XML配置文件可以提高系统的灵活性。即程序的行为是通过XML文件配置的,而不是硬编码。

  • XML语法

一个XML文件分为如下几部分内容:

  • 文档声明
  • 元素
  • 属性
  • 注释  
  • CDATA区 、特殊字符
  • 处理指令(processing instruction)

 

  1. 1.文档声明
  • 在编写XML文档时,需要先使用文档声明来声明XML文档。且必须出现在文档的第一行。并且必须指定。
  • 最简单的语法:<?xml  version="1.0"  ?>
  • 用encoding属性说明文档所使用的字符编码。保存在硬盘上的文件编码要与声明的编码一致
  • 如:<?xml version="1.0" encoding="GB2312" ?>
  • 用standalone属性说明文档是否独立,即是否依赖其他文档。如:<?xml version="1.0" standalone="yes" ?>yes表示不用引入外部文件,no需要引入。

 

  1. 2.元素

XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:

  • 包含标签体:<a>www.itcast.cn</a>
  • 不含标签体的:<a></a>, 简写为:<a/>
  • 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:
  • <a>welcome to <b>www.it315.org</a></b>
  1. 格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
  2. 对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。

 

  • 第一段:<网址>www.itcast.cn</网址>
  • 第二段:

<网址>

www.itcast.cn

</网址>

 

由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。

  1. 3.属性

一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

  • <input name=“text”>
  • 属性值一定要用双引号(")或单引号(')引起来
  • 定义属性必须遵循与标签相同的命名规范
  • 多学一招:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:
  • <input>

<name>text</name>

</input>

 

  1. 4.元素——命名规范、
  • 一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
  • 区分大小写,例如,<P>和<p>是两个不同的标记。
  • 不能以数字或"_" (下划线)开头。
  • 不能以xml(或XML、或Xml 等)开头。
  • 不能包含空格。
  • 名称中间不能包含冒号(:)。
  1. 5.注释
  • Xml文件中的注释采用:“<!--注释-->” 格式。
  • 注意:XML声明之前不能有注释,注释不能嵌套,例如:
  • <!--大段注释
  • ……
  • <!--局部注释-->
  • ……
  • -->  
  • XML中的数据必须通过软件程序来解析执行或显示,如IE;这样的解析程序称之为Parser(解析器)。
  1. 6.转义字符

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理

 

  1. 7.CDATA区
  • 在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
  • 遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。

语法:<![CDATA[ 内容 ]]>

  • <![CDATA[
  • <itcast>
  • <itcast>www.itcast.cn</itcast>
  • </itcast>
  • ]]>

上面红色部分内容会直接原封不动的输出

  1. 8.处理指令

处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。

例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。

  • <?xml-stylesheet type="text/css" href="1.css"?>

 

处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。

XML语法总结:

  1. 所有 XML 元素都须有关闭标签
  2. XML 标签对大小写敏感
  3. XML 必须正确地嵌套顺序
  4. XML 文档必须有根元素(只有一个)
  5. XML 的属性值须加引号
  6. 特殊字符必须转义 --- CDATA
  7. XML 中的空格、回车换行会解析时被保留
  • XML约束之DTD的使用

 

  1. 为什么要有约束?

  • XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat)
  • XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
  • 两个概念:格式良好的XML:遵循XML语法的XML。有效的XML:遵循约束文档的XML
  • 总之:约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等
  1.  2.XML约束概述

  1. XML约束概念:在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
  2. 常用的约束技术:XML DTD 和XML Schema
  3. DTD约束快速入门
  4. DTD(Document Type Definition),全称为文档类型定义。

Book.xml

 

 

Book.dtd

 

 

复杂标签:<!ELEMENT 标签名 (子节点)>

简单标签:<!ELEMENT 标签名 (#PCDATA)>

引入DTD:<!DOCTYPE 根节点 SYSTEM  "dtd的地址">

  1. 将DTD与XML文档关联的三种形式

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

  • 使用内部DTD 。<!DOCTYPE 根节点  [DTD的代码]>
  • 使用外部DTD。<!DOCTYPE 根节点 "DTD的地址">
  • 使用网络DTD。<!DOCTYPE 根节点 PUBLIC  "DTD的名称"  "DTD的地址">

      常见的使用网络DTD约束有Struts2的框架

在XML文件内编写DTD

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<!DOCTYPE 书架 [

<!ELEMENT 书架 (书+)>

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

<!ELEMENT 书名 (#PCDATA)>

<!ELEMENT 作者 (#PCDATA)>

<!ELEMENT 售价 (#PCDATA)>

]>

<书架>

<书>

<书名>Java就业培训教程</书名>

<作者>张孝祥</作者>

<售价>39.00元</售价>

</书>

...

</书架>

 

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

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

  • 使用内部DTD 。<!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">
  1. DTD约束语法细节

(1)DTD-定义元素

在DTD文档中使用ELEMENT关键字来声明一个XML元素。

语法:<!ELEMENT 元素名称  使用规则>

使用规则:

  1. (#PCDATA)指示元素的主题内容只能是普通的文本。
  2. EMPTY:用于指示元素的主体为空。比如<br/>
  3. ANY:用于指示元素的主题内容为任意类型。
  4. (子元素):指示元素中包含的子元素。

定义子元素及描述它们的关系:

  1) 如果子元素用逗号隔开,必须按照声明顺序去编写XML文档。

     例如:<!ELEMENT FILE(TITLE, AUTHOR, EMAIL)>

  2)如果子元素用"|" 分开,说明任选其一。

     例如:<!ELEMENT FILE(TITLE|AUTHOR|EMAIL)>

  3)用+、*、? 来表示元素出现的次数。

     如果元素后面没有+*?表示必须且只能出现一次。

     +:表示至少出现一次,一次或多次。

     *:表示可有可无,零次、一次或多次。

     ?:表示可以有也可以无,有的话只能出现一次。零次或一次。

如:<!ELEMENTMYTITLE((TITLE*,AUTHOR?,EMAIL))*|COMMIT> 

(2)元素内容的类型

 

 

 

  1. 元素ELEMENT定义

 

 

DTD属性(ATTLIST)定义

xml文档中的标签属性需通过ATTLIST为其设置属性

语法格式:

<!ATTLIST 元素名

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

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

……

>

属性声明举例:

<!ATTLIST 商品

类别 CDATA #REQUIRED

颜色 CDATA #IMPLIED

>

对应XML文件:

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

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

 

属性值类型:

  • CDATA:表示属性的取值为普通的文本字符串。
  • ENUMERATED(DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
  • ID:表示属性的取值不能重复(不能只写数字)

设置说明:

  1. #REQUIRED:表示该属性必须出现
  2. #IMPLIED:表示该属性可有可无。
  3. #FIXED:表示该属性的取值为一个固定值。语法:#FIXED "固定值"
  4. 直接值:表示属性的取值为默认值。

约束的四种形式:

 

 

DTD 定义属性示例一:

<!ATTLIST 页面作者

   姓名   CDATA    #IMPLIED

   年龄   CDATA    #IMPLIED

   联系信息  CDATA  #REQUIRED

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

   个人爱好  CDATA  "上网"

>

DTD 定义属性示例二:

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

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

DTD 定义属性示例三:

ID属性的值只能由字母,下划线开始,不能出现空白字符。表示属性的设置值是一个唯一值。

 

 

 

实体的引入

实体定义:

  1. 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
  2. 实体可分为两种类型:引用实体和参数实体
  • 在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
  • <!ENTITY 别名 “值”>
  • 在元素中引用  &别名;

定义引用实体:

  1. 概念:在DTD中定义,在XML中使用
  2. 语法:<!ENTITY 实体名称 “实体内容”>
  3. 引用方式(注意是在XML中使用):&实体名称;

DTD中定义:
<!ENTITY copyright “版权所有”>
XML中引用:
©right;

 

定义参数实体:

参数实体被 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 version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE CATALOG [
	<!-- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了
	(相当于变量)
	
	实体:主要分为引用实体和参数实体
	
	1.参数实体被 DTD 文件自身使用
	语法格式:
	   <!ENTITY % 实体名称 "实体内容" >
	引用方式:
	%实体名称;
	举例1:
	 <!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
    <!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>
	 <!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>
	
	
	
	2.引用实体主要在 XML 文档中被应用
	语法格式:
	<!ENTITY 实体名称 “实体内容” >:直接转变成实体内容
	引用方式:
	&实体名称;
	举例:
	<!ENTITY copyright “I am a programmer"> 
	 ……
	 &copyright; -->
	
	<!ENTITY AUTHOR "John Doe">
	<!ENTITY COMPANY "JD Power Tools, Inc.">
	<!ENTITY EMAIL "jd@jd-tools.com">
	<!-- 参数实体 -->
	<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
	
	
	<!ELEMENT CATALOG (PRODUCT+)>
	
	<!ELEMENT PRODUCT
	(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?,个人信息)>
	<!ATTLIST PRODUCT
	NAME CDATA #IMPLIED
	CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
	PARTNUM CDATA #IMPLIED
	PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
	INVENTORY (InStock|Backordered|Discontinued) "InStock">
	
	<!ELEMENT SPECIFICATIONS (#PCDATA)>
	<!ATTLIST SPECIFICATIONS
	WEIGHT CDATA #IMPLIED
	POWER CDATA #IMPLIED>
	
	<!ELEMENT OPTIONS (#PCDATA)>
	<!ATTLIST OPTIONS
	FINISH (Metal|Polished|Matte) "Matte" 
	ADAPTER (Included|Optional|NotApplicable) "Included"
	CASE (HardShell|Soft|NotApplicable) "HardShell">
	
	<!ELEMENT PRICE (#PCDATA)>
	<!ATTLIST PRICE
	MSRP CDATA #IMPLIED
	WHOLESALE CDATA #IMPLIED
	STREET CDATA #IMPLIED
	SHIPPING CDATA #IMPLIED>	
	<!ELEMENT NOTES (#PCDATA)>	

]>

<CATALOG>
	<PRODUCT CATEGORY="Shop-Professional">
		<SPECIFICATIONS>aaa</SPECIFICATIONS>
		<OPTIONS>ccc</OPTIONS>
		<PRICE>
		
		</PRICE>
		<NOTES>&EMAIL;</NOTES>
		<个人信息>生日</个人信息>
	</PRODUCT>
	<PRODUCT>
		<SPECIFICATIONS>bbb</SPECIFICATIONS>
		<PRICE>ddd</PRICE>
		<个人信息>生日</个人信息>

	</PRODUCT>

</CATALOG>

 

 

第一次写排版不是很好,望见谅

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值