XML语言以及DTD的详解
-
xml语言
-
什么是XML?
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
-
XML技术用于解决什么问题?
(1)XML是一种通用的数据交换格式。
(2)在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在起始标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。
例如:
- XML的常见应用
XML技术用于保存有关系的数据之外,它还常用作软件配置文件,以描述程序模块之间的关系(如Struts、Spring、Hibernate等都是基于XML作为配置文件的)。
在一个软件系统中,通过XML配置文件可以提高系统的灵活性。即程序的行为是通过XML文件配置的,而不是硬编码。
- XML语法
一个XML文件分为如下几部分内容:
- 文档声明
- 元素
- 属性
- 注释
- CDATA区 、特殊字符
- 处理指令(processing instruction)
- 1.文档声明
- 在编写XML文档时,需要先使用文档声明来声明XML文档。且必须出现在文档的第一行。并且必须指定。
- 最简单的语法:<?xml version="1.0" ?>
- 用encoding属性说明文档所使用的字符编码。保存在硬盘上的文件编码要与声明的编码一致。
- 如:<?xml version="1.0" encoding="GB2312" ?>
- 用standalone属性说明文档是否独立,即是否依赖其他文档。如:<?xml version="1.0" standalone="yes" ?>yes表示不用引入外部文件,no需要引入。
- 2.元素
XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
- 包含标签体:<a>www.itcast.cn</a>
- 不含标签体的:<a></a>, 简写为:<a/>
- 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:
- <a>welcome to <b>www.it315.org</a></b>
- 格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
- 对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
- 第一段:<网址>www.itcast.cn</网址>
- 第二段:
<网址>
www.itcast.cn
</网址>
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
- 3.属性
一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
- <input name=“text”>
- 属性值一定要用双引号(")或单引号(')引起来
- 定义属性必须遵循与标签相同的命名规范
- 多学一招:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:
- <input>
<name>text</name>
</input>
- 4.元素——命名规范、
- 一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
- 区分大小写,例如,<P>和<p>是两个不同的标记。
- 不能以数字或"_" (下划线)开头。
- 不能以xml(或XML、或Xml 等)开头。
- 不能包含空格。
- 名称中间不能包含冒号(:)。
- 5.注释
- Xml文件中的注释采用:“<!--注释-->” 格式。
- 注意:XML声明之前不能有注释,注释不能嵌套,例如:
- <!--大段注释
- ……
- <!--局部注释-->
- ……
- -->
- XML中的数据必须通过软件程序来解析执行或显示,如IE;这样的解析程序称之为Parser(解析器)。
- 6.转义字符
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理
- 7.CDATA区
- 在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
- 遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
语法:<![CDATA[ 内容 ]]>
- <![CDATA[
- <itcast>
- <itcast>www.itcast.cn</itcast>
- </itcast>
- ]]>
上面红色部分内容会直接原封不动的输出
- 8.处理指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
- <?xml-stylesheet type="text/css" href="1.css"?>
处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
XML语法总结:
- 所有 XML 元素都须有关闭标签
- XML 标签对大小写敏感
- XML 必须正确地嵌套顺序
- XML 文档必须有根元素(只有一个)
- XML 的属性值须加引号
- 特殊字符必须转义 --- CDATA
- XML 中的空格、回车换行会解析时被保留
- XML约束之DTD的使用
-
为什么要有约束?
- XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat)
- XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
- 两个概念:格式良好的XML:遵循XML语法的XML。有效的XML:遵循约束文档的XML
- 总之:约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等
-
2.XML约束概述
- XML约束概念:在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
- 常用的约束技术:XML DTD 和XML Schema
- DTD约束快速入门
- DTD(Document Type Definition),全称为文档类型定义。
Book.xml
Book.dtd
复杂标签:<!ELEMENT 标签名 (子节点)>
简单标签:<!ELEMENT 标签名 (#PCDATA)>
引入DTD:<!DOCTYPE 根节点 SYSTEM "dtd的地址">
- 将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元</售价>
</书>
...
</书架>
- 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">
-
DTD约束语法细节
(1)DTD-定义元素
在DTD文档中使用ELEMENT关键字来声明一个XML元素。
语法:<!ELEMENT 元素名称 使用规则>
使用规则:
- (#PCDATA)指示元素的主题内容只能是普通的文本。
- EMPTY:用于指示元素的主体为空。比如<br/>
- ANY:用于指示元素的主题内容为任意类型。
- (子元素):指示元素中包含的子元素。
定义子元素及描述它们的关系:
1) 如果子元素用逗号隔开,必须按照声明顺序去编写XML文档。
例如:<!ELEMENT FILE(TITLE, AUTHOR, EMAIL)>
2)如果子元素用"|" 分开,说明任选其一。
例如:<!ELEMENT FILE(TITLE|AUTHOR|EMAIL)>
3)用+、*、? 来表示元素出现的次数。
如果元素后面没有+*?表示必须且只能出现一次。
+:表示至少出现一次,一次或多次。
*:表示可有可无,零次、一次或多次。
?:表示可以有也可以无,有的话只能出现一次。零次或一次。
如:<!ELEMENTMYTITLE((TITLE*,AUTHOR?,EMAIL))*|COMMIT>
(2)元素内容的类型
- 元素ELEMENT定义
DTD属性(ATTLIST)定义
xml文档中的标签属性需通过ATTLIST为其设置属性
语法格式:
<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
……
>
属性声明举例:
<!ATTLIST 商品
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
对应XML文件:
<商品 类别="服装" 颜色="黄色">…</商品>
<商品 类别="服装">…</商品>
属性值类型:
- CDATA:表示属性的取值为普通的文本字符串。
- ENUMERATED(DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
- ID:表示属性的取值不能重复(不能只写数字)
设置说明:
- #REQUIRED:表示该属性必须出现
- #IMPLIED:表示该属性可有可无。
- #FIXED:表示该属性的取值为一个固定值。语法:#FIXED "固定值"
- 直接值:表示属性的取值为默认值。
约束的四种形式:
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属性的值只能由字母,下划线开始,不能出现空白字符。表示属性的设置值是一个唯一值。
实体的引入
实体定义:
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
- 实体可分为两种类型:引用实体和参数实体
- 在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
- <!ENTITY 别名 “值”>
- 在元素中引用 &别名;
定义引用实体:
- 概念:在DTD中定义,在XML中使用
- 语法:<!ENTITY 实体名称 “实体内容”>
- 引用方式(注意是在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">
……
©right; -->
<!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>
第一次写排版不是很好,望见谅