XML基础
XML概述
W3C组织简介
由W3C正式发布的标准称为W3C推荐标准。
什么是XML
是一种通用的数据交换格式,可以使数据在各种应用程序之间轻松地实现数据的交换。
XML与HTML的比较
HTML是不区分大小写的,而XML是严格区分大小写的。
HTML可以有多个根元素,而格式良好的XML有且只能有一个根元素。
HTML中,属性值的引号是可用可不用的,而XML中,属性值必须放在引号中。
HTML中,空格是自动过滤的,而XML中,空格则不会自动删除。
HTML中的标记是预定义的,而XML中的标记是可以随便定义的,并且可扩展。
注意:XML不是HTML的升级,也不是HTML的替代产品,它们的应用领域和范围完全不同
XML语法
文档声明
XML文档声明的语法格式如下所示:
<?xml 版本信息[编码信息][文档独立性信息]?>
从上面的语法格式中可以看出,文档声明以符号“<?”开头,以符号“?>”结束,中间可以声明版本信息,编码信息以及文档独立性信息。
一个完整的XML声明如下所示:
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
版本声明version、文档编码声明encoding、独立文档声明standalone默认为no
注意:XML声明必须位于文档的第一行,前面不能有任何字符。在XML声明时,如果同时设置了encoding和standalone属性,standalone属性要位于encoding属性之后。
元素定义
元素一般是由开始标记,属性,元素内容和结束标记构成,具体示例如下:
<城市>北京</城市>
需要注意的是,如果一个元素没有嵌套在其它元素内,则这个元素称为根元素,根元素是XML文档定义的第一个元素。
一个元素中如果没有嵌套子元素,也没有包含文本内容,则这样的元素称为空元素,空元素可以不使用结束标记,例如:<img></img>可以简写成<img/>。
在XML文档中,元素的名称可以包含字母、数字以及其它一些可见的字符,但是在命名XML元素时,应该遵守以下规范:
(1)区分大小写,例如:<P>和<p>是两个不同的标记。
(2)元素名称中,不能包含空格、冒号、分号、逗号和尖括号等,元素不能以数字开头,否则XML文档会报错。
(3)建议不要使用“.”,因为在很多程序语言中,“.”用于引用对象的属性。
(4)建议不要用减号(-),而以下划线(_)代替,以避免与表达式中的减号(-)运算符发生冲突。
(5)建议名称不要以字符组合xml(或XML、或Xml等)开头。
(6)建议名称的大小写尽量采用同一标准,要么全部大写,要么全部小写。
(7)名称可以使用非英文字符,例如中文,但有些软件可能不支持非英文字符以外的字符,在使用时应考虑这种情况。
属性定义
<售价 单位="元">68</售价>
需要注意的是,在XML文档中,属性的命名规范同元素相同,属性值必须要用双引号(“”)或者单引号(‘’)引起来,否则被视为错误。
属性还可以通过子元素的形式来描述同样的信息,将属性定义的示例代码改写为以下代码,具体如下:
<售价>
<价格>68</价格>
<单位>元</单位>
</售价>
注释
XML注释和HTML注释写法基本一致,具体语法格式如下所示:
<!--注释信息-->
注意:
1、注释不能出现在XML声明之前,XML声明必须是文档的第一行
2、注释不能出现在标记中
3、字符串“--”不能在注释中出现
4、在XML中,不允许注释以“--->”结尾
5、注释不能嵌套使用,因为第一个“<!--”会匹配在它后面第一次出现的“-->”作为一个完整的释符
特殊字符处理
&:&armp、<:<、>:>、":quot、':apos
CDATA区
特殊字符出现在该区中不用使用转换字符,提高了xml文档的可读性
DTD约束
什么是约束
DTD约束
DTD约束是早期出现的一种XML约束模式语言,根据它的语法创建的文件称为DTD文件。
在一个DTD文件中,可以包含元素的定义、元素之间关系的定义、元素属性的定义以及实体和符号的定义。
使用DTD文件约束XML文档,必须在XML文档中引入DTD文件。在XML文档中引入外部DTD文件有两种方式:
(1)<!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI">
(2)<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">
DTD语法
文档声明
2.外部 DTD一本地 DTD ,DTD文档在本地系统上,公司内部自己项目使用 。
3.外部DTD一公共DTD ,DTD 文挡在网络上, 一般都有框架提供 。
元素定义
<!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约束
(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语法
元素定义
<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"/>
属性定义
<xs:attribute name="xxx" type="yyy"/>
element用于声明一个元素,xxx指的是元素的名称,yyy 指元素的数据类型。
XML的简单例子,具体示例如下所示:
<lastname lang="EN">Smith</lastname>
应的Schema定义方式如下所示:
<xs:attribute name="lang" type="xs:string"/>
简单类型
(2)xs:enumeration元素对一组值的限定
(3)xs:pattern元素对一系列值的限定
(4)xs:restriction元素对空白字符的限定
如果需要对空白字符(whitespace characters)进行处理,可以使用 whiteSpace元素。whiteSpace元素有三个属性值可以设定,分别是preserve、replace和collapse。
复杂类型
指的不包含内容,只包含属性的元素,具体示例如下:
<product prodid="1345" />
(2)包含其它元素的元素
(3)仅包含文本的元素
(4)包含元素和文本的元素
dom4j
XML解析概述
解析方式和解析器
1. DOM: 要求解析器把整个XML文档装载到内存,并解析成一个Document 对象 。
a) 优点:元素与元素之间保留结构关系,故可以进行增删改查操作 。
b) 缺点: XML文档过大,可能出现内存溢出显现 。
2. SAX: 是一种速度更快,更有效的方法,它逐行扫描文档,一边扫描一边解析 。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件.
a) 优点 : 处理速度快,可 以处理大文件
b) 缺点 : 只能读 ,逐行后将释放资源 。
3.PULL: Android内置的XML解析方式,类似 SAX.
解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包 。
DOM解析原理及结构模型
DOM 中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点!
1.如果需要使用dom4j,必须导入jar包。
2.dom4j必须使用核心类SaxReader加载xml文档获得 Document,通过Document对象获得文档的根元素,然后就可以操作了
最能让人感到快乐的事,莫过于经过一番努力后,所有东西正慢慢变成你想要的样子!