实现XML解析的几种技术

article/2025/9/27 22:22:53

XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。

在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。

第一种方式:DOM解析器:

DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。

Android完全支持DOM 解析。利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。

DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档——这就是DOM的工作原理。

DOM实现时首先为XML文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,这样代码就可以使用DOM接口来操作整个树结构。 

由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。 当然,如果XML文件的内容比较小,采用DOM是可行的

常用的DoM接口和类:

Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础。  

Element:该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法。

Node:该接口提供处理并获取节点和子节点值的方法。

NodeList:提供获得节点个数和当前节点的方法。这样就可以迭代地访问各个节点。

DOMParser:该类是Apache的Xerces中的DOM解析器类,可直接解析XML文件。

下面是DOM的解析流程

 

采用DOM解析时具体处理步骤是

首先利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例
然后利用DocumentBuilderFactory创建DocumentBuilder

然后加载XML文档(Document,
然后获取文档的根结点(Element)
然后获取根结点中所有子节点的列表(NodeList),
然后使用再获取子节点列表中的需要读取的结点。


第二种方式:SAX解析器:

  SAX(Simple API for XML)解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。  

SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

SAX的工作原理:SAX的工作原理简单地说就是对文档进行顺序扫描,

当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口。XMLReader通过相应事件处理器注册方法setXXXX()来完成的与ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口的连接。

常用的SAX接口和类

 Attrbutes:用于得到属性的个数、名字和值。  

 ContentHandler:定义与文档本身关联的事件(例如,开始和结束标记)。大多数应用程序都注册这些事件。

 DTDHandler:定义与DTD关联的事件。它没有定义足够的事件来完整地报告DTD。如果需要对DTD进行语法分析,请使用可选的DeclHandler。

 DeclHandler是SAX的扩展。不是所有的语法分析器都支持它。

 EntityResolver:定义与装入实体关联的事件。只有少数几个应用程序注册这些事件。

 ErrorHandler:定义错误事件。许多应用程序注册这些事件以便用它们自己的方式报错。

 DefaultHandler:它提供了这些接LI的缺省实现。在大多数情况下,为应用程序扩展DefaultHandler并覆盖相关的方法要比直接实现一个接口更容易。

 详见下表:

 

 

可知,我们需要XmlReader 以及DefaultHandler来配合解析xml。

 下面是SAX的解析流程


采用SAX解析时具体处理步骤是:

1 创建SAXParserFactory对象

2 根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器

3 根据SAXParser解析器获取事件源对象XMLReader

4 实例化一个DefaultHandler对象

5 连接事件源对象XMLReader到事件处理类DefaultHandler中

6 调用XMLReader的parse方法从输入源中获取到的xml数据

7 通过DefaultHandler返回我们需要的数据集合。


第三种方式:PULL解析器: 

      Android并未提供对Java StAX API的支持。但是,Android附带了一个pull解析器,其工作方式类似于StAX。它允许用户的应用程序代码从解析器中获取事件,这与SAX解析器自动将事件推入处理程序相反。 

PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。

     读取到xml的声明返回 START_DOCUMENT;

     读取到xml的结束返回 END_DOCUMENT ;

     读取到xml的开始标签返回 START_TAG

     读取到xml的结束标签返回 END_TAG

     读取到xml的文本返回 TEXT

PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。

PULL 的工作原理:XML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。

常用的XML pull的接口和类: 

XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。

XmlSerializer:它是一个接口,定义了XML信息集的序列。

XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。

XmlPullParserException:抛出单一的XML pull解析器相关的错误。

PULL的解析流程如下

采用PULL解析基本处理方式:

当PULL解析器导航到文档开始标签时就开始实例化list集合用来存贮数据对象。导航到元素开始标签时回判断元素标签类型,如果是river标签,则需要实例化River对象了,

如果是其他类型,则取得该标签内容并赋予River对象。当然它也会导航到文本标签,不过在这里,我们可以不用。

根据以上的解释,我们可以得出以下处理xml文档逻辑:

1:当导航到XmlPullParser.START_DOCUMENT,可以不做处理,当然你可以实例化集合对象等等。

2:当导航到XmlPullParser.START_TAG,则判断是否是river标签,如果是,则实例化river对象,并调用getAttributeValue方法获取标签中属性值。

3:当导航到其他标签,比如Introduction时候,则判断river对象是否为空,如不为空,则取出Introduction中的内容,nextText方法来获取文本节点内容

4:当然啦,它一定会导航到XmlPullParser.END_TAG的,有开始就要有结束嘛。在这里我们就需要判读是否是river结束标签,如果是,则把river对象存进list集合中了,并设置river对象为null.


几种解析技术的比较与总结:  

对于Android的移动设备而言,因为设备的资源比较宝贵,内存是有限的,所以我们需要选择适合的技术来解析XML,这样有利于提高访问的速度。

1 DOM在处理XML文件时,将XML文件解析成树状结构并放入内存中进行处理。当XML文件较小时,我们可以选DOM,因为它简单、直观。

2 SAX则是以事件作为解析XML文件的模式,它将XML文件转化成一系列的事件,由不同的事件处理器来决定如何处理。XML文件较大时,选择SAX技术是比较合理的。虽然代码量有些大,但是它不需要将所有的XML文件加载到内存中。这样对于有限的Android内存更有效,而且Android提供了一种传统的SAX使用方法以及一个便捷的SAX包装器。 使用Android.util.Xml类,从示例中可以看出,会比使用 SAX来得简单。

3 XML pull解析并未像SAX解析那样监听元素的结束,而是在开始处完成了大部分处理。这有利于提早读取XML文件,可以极大的减少解析时间,这种优化对于连接速度较漫的移动设备而言尤为重要。对于XML文档较大但只需要文档的一部分时,XML Pull解析器则是更为有效的方法。

 

以上便是在Android平台中对XML进行解析的方法和使用过程。 










http://chatgpt.dhexx.cn/article/1x6vUwsI.shtml

相关文章

MATLAB中的均值与方差求法(mean,var,std函数使用)

目录 均值-mean()函数的用法方差var函数std函数 均值-mean()函数的用法 对于矩阵A: (1)mean(A,1)为对矩阵A的列求均值 (2)mean(A,2)为对矩阵A的行求均值 (3)mean(A)当传入的参数只有矩阵时&a…

matlab怎么方差函数,密度函数已知,怎么用matlab求其数学期望和方差?

在没有先验知识的情况下是不可能的,在你已知它可能是哪种分布(或者哪些种分布之一)的情况下可以求出分布的参数www.mh456.com防采集。 因为你的是密度函2113数,所以不会5261是离散型随机变量,如果你有4102概率密度函数的表达式的话&#xff0…

matlab怎么算方差和标准差,matlab怎么求矩阵的均值和标准差 看完你就知道了

有时候我们在使用matlab编程计算的时候,想求矩阵的均值和方差,怎么求呢,下面来分享一下方法 工具/材料 matlab 求矩阵的均值和标准差方法 matlab求矩阵均值方法 01 第一步打开matlab命令行窗口,新建一个a[1 2 3;4 5 6;7 8 9]矩阵&…

剩余方差matlab,用matlab的var函数求方差

什么是方差和标准差? 方差(variance) 和标准差(standard variance) 方差:表示一组离散数据偏离平均值的程度。 公式: 方差公式 方差的算术平方根称为该随机变量的标准差。 在Matlab中,方差用var函数求,标准差用std函数…

matlab里方差分析的盒子图怎么看,Matlab方差分析

Matlab 方差分析(T检验) 在工农业生产和科学研究中,经常遇到这样的问题:影响产品产量、质量的因素很多,我们需要了解在这众多的因素中,哪些因素对影响产品产量、质量有显著影响.为此,要先做试验,然后对测试的结果进行分析.方差分析就是分析测试结果的一种方法.在方差分析中,把在…

20171205_Matlab求方差,均值,均方差,协方差的函数

1、 均值 数学定义: Matlab函数:mean >>X[1,2,3] >>mean(X)2 如果X是一个矩阵,则其均值是一个向量组。mean(X,1)为列向量的均值,mean(X,2)为行向量的均值。 >>X[12 3 45 6] >>mean(X,1)[2.5,3.5, 4.5] &g…

方差分析MATLAB实现

单因素方差分析的MATLAB实现 单因素均衡数据的实现 单因素非均衡数据方差分析 p192 8.22 X[85,80,90,88,87,94,56,62,55,48,92,99,95,91,75,72,81];group[ones(1,3),2*ones(1,4),3*ones(1,2),4*ones(1,2),5*ones(1,4),6*ones(1,3)];anova1(X,group); 从箱线图可以看到第2个第五…

matlab算方差std,MATLAB 方差函数 var std

1、均值 数学定义: Matlab函数:mean >>X=[1,2,3] >>mean(X)=2 如果X是一个矩阵,则其均值是一个向量组。mean(X,1)为列向量的均值,mean(X,2)为行向量的均值。 >>X=[1 2 3 4 5 6] >>mean(X,1)=[2.5, 3.5, 4.5] >>mean(X,2)=[2 5] 若要求整个矩…

matlab 方差,方差分解——matlab 代码

封面图片源自网络: 接着前面两期分析,今天介绍期限结构和收益率的方差分解代码: function var_plot= var_term( Phi_DRAW,OMIGA_ff_DRAW,HH) %%%% HH means the step length for forecast %%%%%%%%%% %%%%%% get the forecast variance decomposition %%%%%%% %%% SIGMA_u=P…

matlab u怎么求均方差,Matlab求方差,均值,均方差,協方差的函數

1、均值 數學定義: Matlab函數:mean >>X[1,2,3] >>mean(X)2 如果X是一個矩陣,則其均值是一個向量組。mean(X,1)為列向量的均值,mean(X,2)為行向量的均值。 >>X[1 2 3 4 5 6] >>mean(X,1)[2.5, 3.5, 4.5]…

Matlab系列教程_数值计算_求方差和标准差

首先,什么是方差和标准差? 方差,是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量,统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。在许多实际问题中&#xff…

MATLAB中均值、方差、均方差的计算方法

1、 均值 数学定义: (自己搜一下) Matlab函数:mean >>X[1,2,3] >>mean(X)2 如果X是一个矩阵,则其均值是一个向量组。mean(X,1)为列向量的均值,mean(X,2)为行向量的均值。 >>X[1 2 3 4 5 …

利用MATLAB求均值、方差和标准差

1、 均值 数学定义: Matlab函数:mean 如果X是一个矩阵,则其均值是一个向量组。mean(X,1)为列向量的均值,mean(X,2)为行向量的均值。若要求整个矩阵的均值,则为mean(mean(X))或者mean2(X)。 2、 方差 数学定义&…

matlab 方差计算

代码如下: I imread(); dark_Idouble(I)/255; avgmean2(dark_I); %求图像均值 [m,n]size(dark_I); s0; for x1:mfor y1:nss(dark_I(x,y)-avg)^2; %求得所有像素与均值的平方和。end end%求图像的方差 a1var(dark_I(:)); %第一种方法:利用函数var求得…

环形队列的实现

首先我们先来了解一下队列是什么? 队列:数据先入先出,后进后出(与栈刚好相反),主要通过数组实现。需要通过两个指针来创建对应的队列;一个指针为前缀pre,一个指针为后缀rear。pre指…

环形队列(Python代码实现)

环形队列是是在普通队列上进行的变化,本质和普通单向队列相同,都是队尾进队,队首出队。环形队列与普通队列的区别在于它能够循环利用空间,元素从队首出队后释放的空间能够被重复利用。 主要特点: 当队尾指针front M…

队列和环形队列

1、队列 1) 队列是一个有序列表,可以用数组或是链表来实现。 2) 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。 实例: 声明: MaxSize:队列最大的长度 rear:尾指针&…

数据结构与基础算法-环形队列

一、什么是环形队列。 其实在内存上并没有所谓的环形队列,环形队列只是基于数组线性空间来实现。 环形队列优点: 避免假溢出现象。(因为在数组里,头尾指针只增加不减少,被删元素的空间再也不能被重新利用。会造成尾…

无锁环形队列的几种高效实现

1.环形队列是什么 队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是&#…

队列——数组实现环形队列

【目的】 数组实现环形队列 【思路分析】 1. front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素 front 的初始值 0 2. rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. …