XML的全称是Extensible Markup Language,为可扩展标记性语言,最初它是由SGML(Standard Gerneralized Markup language)语言发展而来的。
相对于标记性语言来说(例如:HTML)而言,XML可自定义标记性标签,并且可将标签和内容有效的分离。
XML与HTML的区别:
XML是用来存储与传输数据的。它可以自定义标签,从功能角度来讲比HTML强大,HTML仅是用来显示数据的,所以XML并不是HTML的替代者,他们是根据不同的需求而产生的两种标记语言。
XML的优势:
1. 它是简单易用的标记性语言
2. 具有严格的格式—XML基本语法
3. 数据逻辑与数据显示逻辑分离---类似于MVC设计模式的理解
4. XML是一种可跨平台的数据交换语言
通过上面我们只是对XML语言有了初步的概念了解,那么它的应用面在哪里呢?
XML与Java EE:
1. 配置描述
例如:web.xml、Struts-config.xml、Spring.xml文件等
2. 简化的数据交换
可使用XML文件暂存信息并提供给页面或服务器进行处理。
3. WebService中的应用
Webservice通过使用基于XML的消息处理作为数据通讯方式,消除了不同组件模型、操作系统和编程语言之间存储存在的差异,使异构系统能作为单个计算机网络协同运行。
4. XML的竞争对手:
Java当中的Annontion(注解)
轻量级数据交换框架--JSON
从以上介绍来看,xml功能非常强大,尤其在当前的移动开发与web应用开发中使用广泛。
XML文档的的分类:
1.格式不良好的(malformed)的XML文档:完全没有遵循XML文档的基本规范的XML文档。
2.格式良好(well-formed)但无效的XML文档:遵守了XML的基本规范,但没有使用DTD或schema定义语义约束的XML文档。
3.有效(valid)的XML文档:遵守了XML文档的基本规范,并使用了DTD或schema的语义约束,并且遵守定义的语义约束的XML文档。
XML的语法:
一个完整的XML文件应包含以下几个部分:
-文档声明
-元素
-属性
-注释
-CDATA区、特殊字符
-处理指令(processing instruction)
文档声明:
在编写XML文档时,需要先使用文档声明,声明XML文档的类型。
例如:<?xml version=”1.0”?>
用encoding属性说明文档的字符编码:
例如:<?xml version=”1.0” encoding=”GB2312”?>
用standalone属性说明文档是否独立(即是否引用其它资源):
例如:
<?xml version=”1.0” encoding=”GB2312” standalone=”?>
注:常见XML错误
常见错误:
1. <?xml version=1.0 ?>
2. <?xml version=“1.0”?>
3.编码错误
常用的字符集:
简体中文:GBK,GB2312
繁体中文:BIG5
西欧字符:ISO8859-1
通用的国际编码:Unicode,UTF-8
XML本身保存的时候会有默认编码格式,请注意保存时的编码属性,否则会造成访问XML文件时出错。
XML元素的基本规则:
元素是XML文档的基本单元,XML文档就是一个层层元素嵌套的元素组成的。整个XML文档从根元素开始,根元素包含若干个子元素,而每个子元素又可以包含多个子元素,从而可以组织成一个完整的XML文档。
XML的标签分为两类:
单标记:<br/>
双标记:<p></p>
XML标签要求:
1.标签名可以有字母(包含非西欧字符)、数字、下划线、中划线、冒号和点组成,但不能以数字、中划线和点开头。
2.标签名不能包含<>,$等
3.标签名中尽量不要出现冒号,除了使用命名空间之外。
4.标签名不能以xml、XML等任意大小写组合。
5.标签名不能包含空格
6.标签名区分大小写
XML标签嵌套子元素:
XML允许深度的嵌套子元素,但需要保证元素之间合理的嵌套,不能交叉嵌套即可,并且XML标签可以嵌套多个重名的子元素。
<a>
<b></b>
</a>
对于空元素,它不可以接受子元素也不可以接受字符串内容,但它可以接受多个属性。
例如<con name=’bank’/>
对于非空元素可以接受字符串,当标签内无内容时包含的是一个空格,空格也算字符。
例如:<p></p> 这个时候P标签所包含的就是一个字符,
<p>中国</p> 也可以这样包含字符串。
注:在格式良好的xml文档中有且只有一个根标签,且在XML文档中空格与换行符都当做标签内的内容来进行处理。
上篇随笔谈到了XML的一些文档的规范,这篇我们来继续学习与认识XML。
一、特殊字符与CDATA区域
在XML文档中如果文本字符中包含了一些特殊的字符,例如<或者&等等,这些字符会引起XML文档会引起文档的混乱。
解决方法如下:
1. 使用实体引用:使用另一个特殊符号代替这些特殊符号
2. 使用CDATA标记:将整个文档定义成字符串。
在特殊标记CDATA下,所有的特殊字符甚至是有效的元素都将被当成简单的字符串进行处理。实体引用也会失去作用,变成直接文本。
CDATA的语法格式如下:
<![CDATA[文本内容]]>
例如:
<![CDATA][1+3<6]>
在XML文档中的注释方法与HTML中完全一致
XML注释语法格式如下:
<!--注释字符串-->
XML注释中允许包含元素和标签,注释不能放在声明之前,不能在注释中使用双中划线,不能再标签体内使用注释,注释内容不能使用“-->”结尾。
二、XML处理指令
简称PI(processing Instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
XML处理指令用于给处理XML文档的应用程序提供信息,告诉处理程序应该如何解析XML文档,一个完整的XML文档的处理程序,可以读取XML文档的处理指令。
XML处理指令格式如下:
<?处理指令名 处理指令信息?>
例如:<?xml-stylesheet=”text/css” href=”(css样式文件)”?>
这里注意,标签名为中文时,CSS是不起作用的。
三、XML属性
XML属性的特征:
1.XML元素的属性必须有属性值,属性值必须用引号引起来。
2.同一个XML元素不能有多个同名的属性。
3.XML元素里的多个属性之间没有先后顺序。
总结:
1. 必须有一个根元素且只有一个
2. 元素必须合理结束
3. 元素之间必须合理嵌套
4. 元素的属性必须有属性值
只要不满足以上条件的XML文档,那就说明它就不是一个格式良好的XML文档
只要满足就是一个格式良好的XML文档
并且遵守了DTD或者schema就是一个有效的XML文档。
XML文档是一种标准结构化文档,因此可以转换成DOM(Document Object Model)文档模型树,其根节点对应DOM树的根节点。
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
为了能够编写一个格式良好且有效的XML文档,我们需要在XML文档之前添加DTD或者schema约束。
常用的约束有:
1.DTD约束
2.Schema约束
约束在XML文档中的作用:
XML文档的约束可以规定该文档都有哪些标签,包括标签的属性等等,都可以在约束中进行规范编写。
这篇文章我们来认识与使用DTD约束。
DTD约束(Document Type Definition),全称为文档类型定义。
这种约束简单易用,但功能较弱,相对于schema来说简单些,schema使用起来会比较麻烦,但功能也相对强大,在早期的servlet2.x版本以及spring 1.x版本中都是采用DTD来编写其XML文档的约束的。
例如:
DTD对XML文档的约束包括哪几个方面?
1.DTD可以定义XML的根元素、内容和结构。
2.定义XML文档中可以接受哪些元素
3.定义XML文档中每个元素接受的合法内容,比如说是否为空,是否可以是文本,可以接受哪些子元素,和子元素出现的顺序和子元素出现的次数,以及各元素的包含规则等等。
4.定义XML文档中每个元素能接受哪些属性
5.定义XML文档中每个属性的类型,能接受哪些值,以及元素对属性的约束等。
6.定义属性的默认值和固定值。
7.定义XML文档中或DTD中可以使用哪些实体。
DTD有哪些功能?
DTD采用了非XML的语法来描述语义约束,可以实现如下的功能:
1.通过使用DTD可以让每个XML文档带有一个有关自身的格式描述
2.不同的企业或公司等组织一致的使用某个标准的DTD来交换数据
3.应用程序也可使用某个标准的DTD验证所介绍的XML文档是否符合语义约束
4.开发者也可以使用DTD来验证所创建的XML文档
引入DTD的方式:
1.内部DTD
使用DTD的最简单的方式,内部DTD就是指将语义约束与XML文档的内容放在同一个XML文档中。紧跟在XML生命和处理指令之后,以<!DOCTYPE[开始,以]>结束语法格式如下:
在普通的JSP页面编码中,或者HTML页面代码中都会有DTD约束出现,但一般都不是内部DTD约束。
DTD约束细节1:
在DTD文档中使用ELEMENT声明一个XML元素,语法格式如下所示:
<!ELEMENT 元素名称 元素类型>
元素类型可以是元素内容、或类型
如为元素内容:则需要使用()括起来,如
<!ELEMENT 书架 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
如为元素类型,则直接书写,DTD规范定义了如下几种类型:
EMPTY:用于定义空元素,例如<br/> <hr/>
ANY:表示元素内容为任意类型。
DTD细节约束2:
元素内容中可以使用如下方式,描述内容的组成关系
用逗号分隔,表示内容的出现顺序必须与声明时一致。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
用|分隔,表示任选其一,即多个只能出现一个
<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
在元素内容中也可以使用+、*、?等符号表示元素出现的次数:
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
也可使用圆括号( )批量设置,例
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
综合案例:
2.外部DTD
外部DTD的引用:
首先创建一个dtd文件,将DTD的约束写到文件中,然后在XML文档中按以下语法格式添加:
<!DOCTYPE (根元素名称)SYSTEM “外部DTD的URL地址”>
3.公用DTD
引用公用的DTD的语法格式如下:
<!DOCTYPE (根元素名称)PUBLIC “DTD的标识名” “公用DTD的URL地址”>
具体写法可见JavaWEB项目中的web.xml文件,这里就不再贴出代码
DTD的文档结构如下:
第一行是DTD声明部分,该声明与XML文档的声明语法格式相同
0到多个注释部分,DTD注释与XML文档的注释格式完全相同
0到多个<!ELEMENT…>定义的每一个就是一个XML元素
0到多个<!ATTLIST…>顶一个每一个就是一个XML元素的属性
0到多个<!ENTITY…>顶一个每一个就是一个实体
0到多个<!NOTATION…>顶一个每一个就是一个符号
它们彼此之间完全独立,无需相互嵌套。
1. 定义元素
元素类型的定义的全称是:Element Type Definition,简称ETD,它不但会定义每个文件中可能存在的元素,给出的元素名称,而且会定义元素的具体类型。
元素类型描述主要有五种:
a) 任意类型
可以是以下四种中任意的内容
例如:<!ELEMENT book ANY>
b) 字串值
例如:”aaa”
c) 空元素
<br/>
d) 包含子元素
元素嵌套
e) 混合元素
案例:
2. 定义子元素
a) 定义有序的子元素
使用英文逗号,用于分隔有序的子元素
<!ELEMENT book(name,price,state)>
b) 互斥的子元素
互斥的子元素表明一些列的子元素中只能出现其中之一。
使用”|”进行分隔
c) 子元素出现的频率
+(一次次或多次)
?(0次或一次)
*(0次或多次)
注意:混合类型中的频率只能按如下方式添加频率
<!ELEMENT book(#PCDATA|子元素1|子元素2)*>
只能在最后加
d) 组合子元素
<!ELEMENT book(name|price|state)>
这种元素类型呗成为组合子元素
组合元素也可以嵌套写:
<!ELEMENT book((name,price)|state)>
e) 无序的子元素
DTD并没有定义无序子元素的语法,我们只能借助元素组进行定义
例如:
<!ELEMENT book(name|price|state)*>
这时在XML文档中书写标签时,在book标签下三个子元素的顺序是无序的