Android使用SAX解析XML

Android中使用SAX解析XML文件的编程方法 在上面的代码中,我们在MainActivity类中创建了一个XMLParserTask内部类,它扩展了AsyncTask类。在上述代码中,我们创建了一个名为XMLParser的类,它继承自DefaultHandler类,这是SAX解析器的基类。在上面的代码中,我们创建了一个XMLParser类,它继承自DefaultHandler类,这是SAX解析器的基类。通过使用SAX解析器,我们可以有效地解析大型XML文件,因为它在解析过程中一次只处理一个元素Android中使用SAX解析XML文件的编程方法。 阅读详情
 

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:

startDocument()

当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。

endDocument()

和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。

startElement(String namespaceURI, String localName, String qName, Attributes atts)

当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。

endElement(String uri, String localName, String name)

这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。

characters(char[] ch, int start, int length)

这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。

 person.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="22">
		<name>张三丰</name>
		<age>60</age>
	</person>
	<person id="2">
		<name>小龙女</name>
		<age>21</age>
	</person>
</persons>


Person.java 类

package com.scl.domain;

public class Person {
	private Integer id;
	private String name;
	private Short age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Short getAge() {
		return age;
	}
	public void setAge(Short age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "id:" + id + ",name:" + name + ",age:" + age;
	}
	
}


 

只要为SAX提供实现ContentHandler接口的类,那么该类就可以得到通知事件(实际上就是SAX调用了该类中的回调方法)。因为ContentHandler是一个接口,在使用的时候可能会有些不方便,因此,SAX还为其制定了一个Helper类:DefaultHandler,它实现了ContentHandler接口,但是其所有的方法体都为空,在实现的时候,你只需要继承这个类,然后重写相应的方法即可。使用SAX解析person.xml的代码如下:

package com.scl.parse;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.scl.domain.Person;

public class SAXParsePerson {
	public List<Person> getPersons(InputStream in) throws Throwable {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		PersonParser personParser = new PersonParser();
		parser.parse(in,personParser);
		in.close();
		
		return personParser.getPersons();
	}
	private final class PersonParser extends DefaultHandler{
		private List<Person> persons = null;
		private Person person = null;
		private String tag = null;
		
		public List<Person> getPersons(){
			return persons;
		}
		@Override
		public void startDocument() throws SAXException {
			  persons = new ArrayList<Person>();
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			 if("person".equals(localName)){
				 person = new Person();
				 //attributes.getValue(0);这是获取第几个属性的值的方法
				 //下面这个是通过属性名称获得属性值
				 person.setId(new Integer(attributes.getValue("id")));
			 }
			 tag = localName;
		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			if("person".equals(localName)){
				persons.add(person);
				person = null;
			}
			tag = null;
		}

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			 if(tag!=null){
				 String value = new String(ch, start, length);
				 if("name".equals(tag)){
					 person.setName(value);
				 }
				 else if("age".equals(tag)){
					 person.setAge(new Short(value));
				 }
			 }
			 
		}
		
	}
}

单元测试代码

package com.scl.xml.test;

import java.io.InputStream;
import java.util.List;

import com.scl.domain.Person;
import com.scl.parse.SAXParsePerson;

import android.test.AndroidTestCase;
import android.util.Log;

public class XMPParseTest extends AndroidTestCase {
	private static final String TAG = "XMPParseTest";
	public void testSAXParserTest() throws Throwable{
		InputStream in = this.getClass().getClassLoader().getResourceAsStream("person.xml");
		SAXParsePerson sax = new SAXParsePerson();
		List<Person> persons = sax.getPersons(in);
		for(Person p : persons){
			Log.i(TAG, p.toString());
		}
	}
}



 

Android XML数据解析实践:使用SAX解析器 本文还有配套的精品资源,点击获取 简介:本教程深入介绍Android平台下使用SAX解析XML数据的方法,强调其在处理大量数据时内存效率高的特点。通过实例化XML解析器,实现ContentHandler接口以及解析XML文件,本教程展示了如何高效集成XML数据到Android应用,并进行业务逻辑处理。源码项目同时涉及代码结构组织和性能优化,旨在通过实例帮助开发者提升XML处... 阅读详情

相关推荐

KV Cache 详解:新手也能理解的 LLM 推理加速技巧

(Autoregressive)生成的,即每次生成一个 token,然后将其作为输入继续生成下一个 token。:如果序列太长,超过了 KV Cache 的存储限制,就需要丢弃最早的 tokens(类似滑动窗口)。时,每次只会生成一个新 token,然后再把这个 token 作为输入继续生成下一个 token。,只缓存计算过的 K,VK, V,每次只计算新 token 的 K,VK, V,从而提升推理效率。:如果输入的 prompt 发生变化,之前的 KV Cache 不能复用,必须重新计算。

Harry的博客 7354

SAX方式读取XML文件

简介SAX(simple API for XML)是一种XML解析的替代方法。不需要从外界导入包,它属于JAVA类库中类。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。 在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架...

热爱不止,前行不息 4763

学习Fidder主要掌握的技术——流量篡改

本文介绍了Fiddler工具的三种常用调试方法:1)本地映射-通过保存修改JSON响应文件实现接口数据模拟;2)Composer接口调试-通过修改请求参数快速测试接口异常处理;3)断点调试-在请求/响应过程中拦截并修改数据。这三种方法分别适用于前端开发、接口测试和健壮性验证等场景,能够有效提高调试效率。操作步骤包括保存响应、修改数据、配置规则等关键环节,并提供了详细的界面操作指引。

2301_79022773的博客 353

SAX读取xml文件的方法总结

Xml文件的读取有多种方法,每种方法采用不同的操作来读取xml文件。本次将的是SAX的方法读取xml文件。 原理:Sax对xml文件的读取是采用事件机制的,当某事件发生时,就会自动的触发定义好的事件处理方法。在一定程度上与消息机制是相似的。这也是为什么我们要写事件处理类(handler类)的原因。 基本的事件有:Document,Element,characters三种最基本的事件 Xml文件读

行天之路 1084

KITTI数据集下载及解析

KITTI数据集下载及解析 版本 更新时间 更新内容 作者 1 V 1.0 xxx 完成主体内容 W. Xiao 2 文章目录KITTI Dataset1 简介1.1 数据采集平台1.2 坐标系2 数据解析2.1 image文件2.2 velodyne文件2.3 calib文件2.4 label文件3 KITTI可视...

u013086672的博客 5万+

基于Simulink的永磁同步电机(PMSM)无位置传感器矢量控制与龙伯格观测器设计​

本文介绍了基于Simulink的永磁同步电机(PMSM)无位置传感器矢量控制方法,重点讲解了龙伯格观测器的设计与实现。主要内容包括:1)系统架构与数学推导,通过静止坐标系状态方程和极点配置构建观测器;2)Simulink建模步骤,从电机模型搭建到观测器核心代码实现;3)仿真结果对比分析,显示龙伯格观测器相比滑模观测器具有更好的平滑性和抗噪能力;4)工程部署建议,包括参数在线辨识、低速补偿策略和代码生成优化。该方法实现了全速域无感运行,稳态转速误差小于1%,为低成本高可靠性电机控制提供了有效解决方案。

amy_mhd的博客 161

android_xml解析之 使用SAX读取XML文件

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事

09的专栏 874

低功耗设计:如何计算power switch的数量?

power switch加多了漏电高,加少了ir drop会有问题,具体加多少合适要如何计算呢?这里可以给一个参考方式。 第一步,先选switch cell的类型 通常选用HVT类型的switch cell,优点是漏电更低,缺点也很明显,电阻大,压降也大,switch cell的大小选择,可以选择(开启电阻x面积)最小的switch cell,即单位面积提供最小并联电阻的cell类型。 第二步,计算数量 选好类型,确定了开启电阻,可以按照如下公式计算数量: Ron/Xnum • W/V = V•P

m0_61544122的博客 3570

SAX解析XML文件

SAX解析XML文件

m0_46619764的博客 1901

educoder中Hive综合应用案例 — 用户搜索日志分析

Hive综合应用案例 — 用户搜索日志分析

weixin_46026136的博客 4764

YOLO11 Backbone改进:二值化、三值化权重实战(一)

本文介绍了二值化/三值化神经网络的基本概念、优势挑战及应用场景。二值化网络将权重限制为±1,三值化则增加0值,显著减少模型存储需求和计算复杂度。虽然存在精度下降等挑战,但通过技术改进已能在移动设备、自动驾驶等领域应用。文章分析了YOLO11中适合量化的层,并详细阐述了二值化权重原理及Straight-Through Estimator等关键技术。二值化/三值化神经网络为资源受限设备提供了高效的深度学习解决方案。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 298

Android XML解析器 - SAX

继续DOM解析XML SAX解析器  SAX(Simple API for XML)解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式, 主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,

cjwsimple 638

Unity Hololens2开发|(三)工程发布及真机部署(3种方法)

选择项目->属性,进入项目属性页,选择调试,将HoloLens2的IP地址填写至页面,如下图。确保HoloLens2与计算机在同一网络下,并保持开启状态,点击运行,即开始生成部署.注意:该方式不支持覆盖安装,如果重复安装同一个App,需要先卸载再安装!选择Release下的ARM64,选择远程计算机,如下图。

游戏开发小Y的博客 14万+

Android安卓使用SAX方式解析xml

Android安卓使用SAX方式解析xml 修改activity_main.xml中代码,添加button控件,实现点击解析 <Buttonandroid:id="@+id/parser"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="解析"/> 2.新建MyHandler类继承DefaultHandler ...

qq_37196621的博客 384

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android中使用SAX方式解析XML文件

在Android中解析XML文主要有三种方式,分别为Simple API for XML(SAX)、Document Object Model(DOM)和Android附带的pull解析器。在本篇文章中主要采用例子说明使用SAX方式解析XML文件。          SAX是一

Android-Idea 5541

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 如何使用SAX解析XML

今天,简单讲讲android如何使用SAX解析XML 。 昨天,我看代码时,看到了解析xml文档的代码,是使用SAX解析XML。但是我却不会使用SAX,于是在网上查找资料,最终解决了问题。这里记录一下。 解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。 DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结

谢岩的博客 2494

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android用sax解析xml,详解android使用SAX解析XML文件

解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了。优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况...

weixin_36202603的博客 418

Android解析XML方式(一)使用SAX解析

Android解析XML三种方式: 1、DOM (org.w3c.dom)文档对象模型方式,解析完的XML将生成一个树状结构的对象。 2、SAX (org.xml.sax) simpleAPI for XML,以事件的形式通知程序,对XML进行解析。 3、PULL (org.xmlpull.v1) 类似SAX方式,程序以"拉取"的方式对Xml进行解析。   本篇讲解一下SAX解析XML这

WILLIAM-HUAN 个人技术博客 3346

安卓使用DOM,SAX,PULL解析xml,安卓写入xml文件

Xml简介 对Xml不太了解的同学可以看一下这篇Xml的简介:http://www.cnblogs.com/SkySoot/archive/2012/08/24/2654319.html DOM解析Xml Dom解析Xml的时候,会将Xml文件的所有内容以文件树的形式存储到内存中,然后用户通过使用DOM API遍历Xml树,检索需要的内容。 但是,因为它将文件树放在了内存中,如果文件较大的

YanRu的专栏 934

安卓解析XML文件系列1:使用SAX方式

HTTP数据组织方式: HTML方式、XML方式、JSON方式 XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言)。 Android中,解析XML数据的三种方式: 1.DOM(org.w3c.dom) "文档对象模型"方式,解析完的XML将生成一个树状结构的对象。 2.SAX(org.xml.sax) SimpleAPI for XML,以事件的形式

luoshiwutai的博客 729

android 使用SAX解析xml

android 提供了三种解析xml的方式,分别是sax,dom,pull, pull是android独有的,在以前Java学习中没有出现过,dom和sax java中一直使用,如dom4j就是使用的sax. 接下来我们学习sax在android系统中的学习。 第一步:我们

java 1041

Android中使用SAX对XMl文件进行解析

在android中的xml的文件解析,一般有三种方法 sax,dom,pull; 不过一般使用最多的是sax技术;在Java中使用SAX技术解析XML文档      sax解析技术是解析速度很快,并且占用很小量的内存;sax解析的方法是进行事件驱动的方法,相对于dom技术必须要调用这个xml文档到内存中,他不需要整个xml文档,     按顺序进行解析,按要求把xml当如到内存中;当我们在解析

江清清的专栏 3467

Android 使用SAX解析XML格式数据

SAX(Simple API for XML)是一种基于事件驱动的 XML 解析方式,适用于处理大规模 XML 文档。SAX 解析器不会将整个 XML 加载到内存中,而是逐行解析,因此在性能和内存占用方面优于 DOM 解析。

XHRK1的博客 601

android使用sax解析xml

随着技术的发展,现在的web已经和以前不同了。web已经逐渐像移动的方向倾斜,作为程序员的确应该拓展一下自己的知识层面。学习各方面的知识,今天就接着前几天的弄一下android的xml解析,这次就使用sax的方式解析xml.下面就一步一步的来做吧。 1.编写一个简单的xml will 21 will2 22   2.

技术成就梦想 1438

Android中使用sax解析XML

在Android中使用XML解析数据是非常常见的一件事,但是使用那种方式比较好呢,因为基于Android开发的硬件毕竟性能一般有限,主要是手机和嵌入式设备。一般我们使用sax解析。速度比较快,也不大耗内存。当然负面影响也是有的,编码比较多,而且比较复杂些。下面我们来看一个例子: 首先我们实现一个xml的实体类,如下: //收藏...

weixin_33881753的博客 173
上一篇: 使用sdcard进行数据存取
下一篇: Android使用DOM解析xml
com360
博客等级 码龄16年 225粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值