Java精选笔记_XML基础

XML基础

XML概述

W3C组织简介

W3C是World Wide Web Consortium(万维网联盟)的缩写,它是对网络标准定制的一个非赢利组织,如HTML、XHTML、CSS、XML的标准就是由W3C来定制。
由W3C正式发布的标准称为W3C推荐标准。

什么是XML

是EXtensible Markup Language的缩写,它是一种类似于HTML的标记语言,称为可扩展标记语言,传输数据而不是显示数据,可以自定义标签,具有自我描述性
是一种通用的数据交换格式,可以使数据在各种应用程序之间轻松地实现数据的交换。

XML与HTML的比较

HTML中的标记是用来显示数据的,而XML中的标记用来描述数据的性质和结构。
HTML是不区分大小写的,而XML是严格区分大小写的。
HTML可以有多个根元素,而格式良好的XML有且只能有一个根元素。
HTML中,属性值的引号是可用可不用的,而XML中,属性值必须放在引号中。
HTML中,空格是自动过滤的,而XML中,空格则不会自动删除。
HTML中的标记是预定义的,而XML中的标记是可以随便定义的,并且可扩展。
注意:XML不是HTML的升级,也不是HTML的替代产品,它们的应用领域和范围完全不同

XML语法

文档声明

在一个完整的XML文档中,必须包含一个XML文档声明,这个声明表示该文档是一个XML文档,以及该文档遵循哪个XML版本的规范。

XML文档声明的语法格式如下所示:
<?xml 版本信息[编码信息][文档独立性信息]?>
从上面的语法格式中可以看出,文档声明以符号“<?”开头,以符号“?>”结束,中间可以声明版本信息,编码信息以及文档独立性信息。

一个完整的XML声明如下所示:
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
版本声明version、文档编码声明encoding、独立文档声明standalone默认为no

注意:XML声明必须位于文档的第一行,前面不能有任何字符。在XML声明时,如果同时设置了encoding和standalone属性,standalone属性要位于encoding属性之后。

元素定义

在XML文档中,主体内容都是由元素(Element)组成的。
元素一般是由开始标记,属性,元素内容和结束标记构成,具体示例如下:
<城市>北京</城市>

需要注意的是,如果一个元素没有嵌套在其它元素内,则这个元素称为根元素,根元素是XML文档定义的第一个元素。

一个元素中如果没有嵌套子元素,也没有包含文本内容,则这样的元素称为空元素,空元素可以不使用结束标记,例如:<img></img>可以简写成<img/>。

在XML文档中,元素的名称可以包含字母、数字以及其它一些可见的字符,但是在命名XML元素时,应该遵守以下规范:
(1)区分大小写,例如:<P>和<p>是两个不同的标记。
(2)元素名称中,不能包含空格、冒号、分号、逗号和尖括号等,元素不能以数字开头,否则XML文档会报错。
(3)建议不要使用“.”,因为在很多程序语言中,“.”用于引用对象的属性。
(4)建议不要用减号(-),而以下划线(_)代替,以避免与表达式中的减号(-)运算符发生冲突。
(5)建议名称不要以字符组合xml(或XML、或Xml等)开头。
(6)建议名称的大小写尽量采用同一标准,要么全部大写,要么全部小写。
(7)名称可以使用非英文字符,例如中文,但有些软件可能不支持非英文字符以外的字符,在使用时应考虑这种情况。

属性定义

在XML文档中,可以为元素定义一个或多个属性,属性是对元素的进一步描述和说明,每个属性都有自己的名称和取值,具体示例如下:
<售价 单位="元">68</售价>

需要注意的是,在XML文档中,属性的命名规范同元素相同,属性值必须要用双引号(“”)或者单引号(‘’)引起来,否则被视为错误。

属性还可以通过子元素的形式来描述同样的信息,将属性定义的示例代码改写为以下代码,具体如下:
<售价>
    <价格>68</价格>
    <单位>元</单位>
</售价>

注释

被注释的内容会被程序忽略而不被解析和处理
XML注释和HTML注释写法基本一致,具体语法格式如下所示:
<!--注释信息-->

注意:
1、注释不能出现在XML声明之前,XML声明必须是文档的第一行
2、注释不能出现在标记中
3、字符串“--”不能在注释中出现
4、在XML中,不允许注释以“--->”结尾
5、注释不能嵌套使用,因为第一个“<!--”会匹配在它后面第一次出现的“-->”作为一个完整的释符

特殊字符处理


在XML文档中,表示这些特殊字符的转义字符序列称为预定义实体。
&:&armp、<:&lt、>:&gt、":quot、':apos

CDATA区

Character Data的简写,即字符数据,CDATA区指的是不想被程序解析的一段原始数据,它以“<![CDATA[”开始,以“]]>”结束。

特殊字符出现在该区中不用使用转换字符,提高了xml文档的可读性

DTD约束

什么是约束

在XML文档中,定义了一套规则来对文档中的内容作出限制约束,这套约束称为XML约束。

DTD约束

最常用的两种约束语言是DTD约束和Schema约束。
DTD约束是早期出现的一种XML约束模式语言,根据它的语法创建的文件称为DTD文件。

在一个DTD文件中,可以包含元素的定义、元素之间关系的定义、元素属性的定义以及实体和符号的定义。
使用DTD文件约束XML文档,必须在XML文档中引入DTD文件。在XML文档中引入外部DTD文件有两种方式: 
(1)<!DOCTYPE 根元素名称 SYSTEM  "外部DTD文件的URI">
(2)<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">

DTD语法

文档声明


1.内部DTD,在XML文档内部嵌入DTD,只对当前 XML有效。
2.外部 DTD一本地 DTD ,DTD文档在本地系统上,公司内部自己项目使用 。
3.外部DTD一公共DTD ,DTD 文挡在网络上, 一般都有框架提供 。

元素定义


在DTD定义中,每一条<!ELEMENT…>语句用于定义一个元素,其基本的语法格式如下所示:
<!ELEMENT 元素名称 元素内容>

“元素内容”共有五种内容形式,具体如下:
(1)#PCDATA:表示元素中嵌套的内容是普通文本字符串
(2)子元素:说明元素包含的元素
(3)混合内容:表示元素既可以包含字符数据,也可以包含子元素
(4)EMPTY:表示该元素既不包含字符数据,也不包含子元素,是一个空元素
(5)ANY:表示该元素可以包含任何的字符数据和子元素

在定义元素时,“元素内容”中可以包含一些符号,其中常见的符号具体如下:
问号[?]:表示该对象可以出现0次或1次。
星号[*]:表示该对象可以出现0次或多次。
加号[+]:表示该对象可以出现1次或多次。
竖线[|]:表示列出的对象中选择1个。
逗号[,]:表示对象必须按照指定的顺序出现。
括号[()]:用于给元素进行分组。

属性定义

设置说明
定义元素的属性时,有四种设置说明可以选择,具体如下:
1)#REQUIRED:表示元素的该属性是必须的
2)#IMPLIED:表示元素可以包含该属性,也可以不包含该属性
3)#FIXED:表示一个固定的属性默认值,在XML文档中不能将该属性设置为其它值。
4)默认值:和FIXED一样,如果元素不包含该属性,该属性将被自动设置为DTD中定义的默认值

属性类型
1)CDATA
这是最常用的一种属性类型,表明属性类型是字符数据,与元素内容说明中的#PCDATA相同。
2)Enumerated(枚举类型)
在声明属性时,可以限制属性的取值只能从一个列表中选择,这类属性属于Enumerated(枚举类型)。需要注意的是,在DTD定义中并不会出现关键字Enumerated。
3)ID
一个ID类型的属性用于唯一标识XML文档中的一个元素。其属性值必须遵守XML名称定义的规则。一个元素只能有一个ID类型的属性,而且ID类型的属性必须设置为#IMPLIED或#REQUIRED。
4)IDREF和IDREFS
5)NMTOKEN和NMTOKENS
NMTOKEN是Name Token的简写,它表示由一个或者多个字母、数字、句点(.)、连字号(-)或下划线(_)所组成的一个名称。NMTOKENS关键字表示一种列表类型。一个元素的NMOTOKENS类型的属性设置值可以是同一个XML文件中的另外多个NMTOKEN类型的属性的设置值,每个NMTOKEN属性值之间用空格分隔。
6)NOTATION
通过设置NOTATION类型的属性来让一个外部应用程序进行处理。在DTD文件中,NOTATION定义语句分为两种情况,具体如下:
第一种情况:<!NOTATION 符号名 SYSTEM "MIME类型">
第二种情况:<!NOTATION 符号名 SYSTEM "URL路径名">
7)ENTITY和ENTITYS
ENTITY对应的中文意思为实体,当某个属性的类型设置为ENTITY时,表明其属性值必须为在DTD中使用<!ENTITY …>语句定义的一个实体(entity)的引用。

实体定义

引用实体
引用实体的定义方式如下所示:
(1)<!ENTITY 实体名称 "实体内容">
(2)<!ENTITY 实体名称 SYSTEM "外部XML文档的URL">

引用实体用于解决XML文档中内容重复的问题,其引用方式方法为:
&实体名称;

参数实体
参数实体只能被DTD文件自身使用,它的语法格式如下所示:
<!ENTITY % 实体名称 "实体内容">
注意:在声明参数实体时,ENTITY、%、实体名和“实体内容”之间各有一个空格。
引用参数实体的方式是:%实体名称;

Schema约束

什么是Schema约束

XML Schema与DTD比较,具有下列优点:
(1)DTD采用的是非XML语法格式,而XML Schema采用的是XML语法格式,而且它本身也是一种XML文档。
(2)DTD和XML Schema都用于对XML文档进行描述,都被用作验证XML合法性的基础。但是,DTD本身合法性的验证必须采用另外一套机制,而XML Schema则采用与XML文档相同的合法性验证机制。
(3)XML Schema对名称空间支持的非常好,而DTD几乎不支持名称空间。
(4)DTD支持的数据类型非常有限。
(5)DTD定义约束的能力非常有限,无法对XML实例文档作出更细致的语义限制。
(6)Schema是新的XML 文档约束:Schema 要比 DTD 强大很多,是 DTD 替代者 ;

名称空间

什么是命名空间

名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元索和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。

它可以唯一标识一个元素或者属性。声明名称空间的语法如下所示:
<元素名 xmlns:prefixname="URI">

Schema语法

元素定义


Schema和DTD一样,都可以定义XML文档中的元素。在Schema文档中,元素定义的语法格式如下所示:
<xs:element name="xxx" type="yyy"/>

element用于声明一个元素,xxx指的是元素的名称,yyy 指元素的数据类型。

在XML Schema 中有很多内建的数据类型,其中最常用的有以下几种: 
xs:string:表示字符串类型
xs:decimal:表示小数类型
xs:integer:表示整数类型
xs:boolean:表示布尔类型
xs:date:表示日期类型
xs:time:表示时间类型

XML的示例代码,具体示例如下:
<lastname>Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn>
这三个元素对应的Schema定义如下所示:
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>

属性定义


在Schema文档中,属性定义的语法格式如下所示:
<xs:attribute name="xxx" type="yyy"/>
element用于声明一个元素,xxx指的是元素的名称,yyy 指元素的数据类型。

XML的简单例子,具体示例如下所示:
<lastname lang="EN">Smith</lastname>
应的Schema定义方式如下所示:
<xs:attribute name="lang" type="xs:string"/>

简单类型


(1)xs:minInclusive和xs:maxInclusive元素对值的限定

(2)xs:enumeration元素对一组值的限定

(3)xs:pattern元素对一系列值的限定

(4)xs:restriction元素对空白字符的限定
如果需要对空白字符(whitespace characters)进行处理,可以使用 whiteSpace元素。whiteSpace元素有三个属性值可以设定,分别是preserve、replace和collapse。

复杂类型


(1)空元素
指的不包含内容,只包含属性的元素,具体示例如下:
<product prodid="1345" />
(2)包含其它元素的元素
(3)仅包含文本的元素
(4)包含元素和文本的元素

dom4j

XML解析概述

当将数据存储在XML后 ,我们就希望通过程序获得XML的内容。如果我们使用 Java 基础所学习的IO知识是可以完成的 ,不过你需要非常繁琐的操作才可以完成,且开发中会遇到不同问题 (只读、读写)。人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作 XML。

解析方式和解析器

开发中比较常见的解析方式有三种,如下 :
1. DOM: 要求解析器把整个XML文档装载到内存,并解析成一个Document 对象 。
a) 优点:元素与元素之间保留结构关系,故可以进行增删改查操作 。
b) 缺点: XML文档过大,可能出现内存溢出显现 。
2. SAX: 是一种速度更快,更有效的方法,它逐行扫描文档,一边扫描一边解析 。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件.
a) 优点 : 处理速度快,可 以处理大文件
b) 缺点 : 只能读 ,逐行后将释放资源 。
3.PULL: Android内置的XML解析方式,类似 SAX.
解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包 。

DOM解析原理及结构模型

XML DOM和HTML DOM 类似,XMLDOM 将整个XML文档加载到内存,生成一个 DOM 树,并获得一个Document对象,通过Document对象就可以对 DOM 进行操作.

DOM 中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点!

API使用
1.如果需要使用dom4j,必须导入jar包。
2.dom4j必须使用核心类SaxReader加载xml文档获得 Document,通过Document对象获得文档的根元素,然后就可以操作了

上一篇:java设计模式--观察者模式和事件监听器模式


下一篇:Linux 操作 mysql