首页 > 代码库 > XML简明教程——文档对象模型——DOM和SAX(一)

XML简明教程——文档对象模型——DOM和SAX(一)

概述

SAX是基于事件解析XML文档的代表性技术。SAX通过扫描XML文档的内容,对元素,属性和文本数据内容等逐一分析和处理。

1.XML基于时间的解析模式

    基于事件的解析是指XML处理程序线性描述一个XML文档,当XML处理出鞥许从文档的开头至结尾读取XML文档的过程中,逐一分析和处理遇到的元素、属性和字符数据等。

【例子1】奥运金牌榜XML文件:

<?xml version = "1.0" encoding = "UTF-8"?>

<?xml-stylesheet type="application/xml" href = http://www.mamicode.com/"priority.xsl"?>

<olympic>

    <olympic_games>

        <year>2008</year>

        <city>Beijing</city>

        <country>China</country>

        <medal_standings>

            <country code = "CHN">

                <name>China</name>

                <rank>1</rank>

                <gold>51<gold>

            </country>

            <country code = "USA">

                <name>United States</name>

                <rank>2</rank>

                <gold>36<gold>

            <country>

            <country code = "RUS">

                <name>Russia</name>

                <rank>3</rank>

                <gold>23</gold>

            <country>

        </medal_standings>

    </olympic_games>

<olympic>

上面例子是一个普通的xml文档,包含了元素、元素的属性、子元素和元素文本内容、处理指令等主要组成部分。当暂时不考虑属性和指令,XML处理程序将依次按照元素的起始和结束标签等判断元素的编辑范围以及元素内容,并且能够判断元素的层次关系,最终向应用程序报告当前这个你在处理的内容。一个简单的基于事件处理的XML处理程序解析例子,能够得到如下解析结果:

Start Document


Start Element: olympic

Characters:


Start Element:year

Characters:2008

End Element:year

Characters:


Start Element:city

Characters:Beijing

End Element:city

Characters:


Start Element:country

Characters:China

End Element:country

Characters:


Start Element: medal_standings

Characters: 


Start Element: country

Characters: 


Start Element: name

Characters: China

End Element: name

Characters: 


Start Element: rank

Characters: 1

End Element:rank 

Characters: 


Start Element: gold

Characters: 51

End Element: gold

Characters: 


End Element: country

Characters:


Start Element: Country

Characters: 


Start Element: name

Characters: United States

End Element: name

Characters: 


Start Element: rank

Characters: 2

End Element:rank 

Characters: 


Start Element: gold

Characters: 36

End Element: gold

Characters: 


End Element: country

Characters: 


Start Element: country

Characters: 


Start Element: name

Characters: Russia

End Element: name

Characters: 


Start Element: rank

Characters: 3

End Element:rank 

Characters: 


Start Element: gold

Characters: 3

End Element:gold 

Characters: 


End Element: country

Characters: 


Start Element: medal_standings

Characters: 


Start Element: olympic_games

Characters: 


Start Element: olympic


End Document

    以上是对例子的一个简单的解析过程,整个过程以XML文档的开始和结尾作为起点和终点。处理过程中的事件包括了文档开始、文档结束、元素开始、元素结束、元素的文本内容等。由于XML处理程序是按照从XML文档中的读取的数据单元进行解析,而不是先进行对XML文档做整体分析,因此及时XML文档不符合形式良好的要求,XML处理程序页并不能事先发现这些错误,知识当正在处理的数据片段与先前已经处理完成的部分发生冲突时,比如结束标签缺失或标签嵌套错误,才会停止解析并报告错误。

    处理速度和效率是基于事件的解析方式的一大优势,尤其是对于体积庞大的大兴XML文档,由于不需要把大量文档中的数据加载到内容,从资源利用的角度看,效率也是比较高的。从另外一个角度看,基于事件的XML解析过程由于需要暂存每一次处理步骤的状态,由于分析XML文档是否满足形式良好的要求和其他有效性约束条件,应用程序必须能够处理随时可能发生的错误,因此对于基于事件的处理方式来说,处理过程相对比较复杂。

(详细内容见《XML简明教程》——张欣毅,著)