Java精选笔记_XML基础

本文介绍了XML的基础知识,包括XML的特点、语法、元素定义等,并详细解释了XML与HTML的区别,以及如何利用DTD和Schema进行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对象获得文档的根元素,然后就可以操作了 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值