Android SAX解析xml文件

andorid读取xml文件内容方法有三种 sax dom pull,其中 pull是android自带的
1.先认识一下xml文件中的些术语

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
</persons>


xml中的标签和内容都可以叫做节点,其中的persons person name age 这些都叫做元素(element).而像李明 25 这些值叫做文本节点.那么有个问题 中<persons>到<person>之间的是什么,什么都没有? 答案是他也是节点,是文本节点,你会说他里面什么都没有啊,错了,它有回车和空格.这个在sax解析xml中你debug一下就会发现.回车和空格(或者是tab)是会被读取出来的.id是属性.
2.sax
sax是采用事件驱动,就是说他不需要完全读完xml文件,他是读到一个节点就解析一个节点是否符合xml语法,如果符合就调用相对应的方法其实就是回调方法,并且没有记忆功能.下面提到的这些方法都是在ContentHander()接口中的方法.
startDocumnet() :当开始解析xml文件的声明的时候就会触发这个事件, 可以做一些初始化的工作
startElement() 当开始解析元素的开始标签的时候,就会触发这个事件
characters() 当读到文本元素的时候要触发这个事件.
endElement() 当读到结束标签的时候 就会触发这个事件

sax就是这样按照顺序来解析的.
3.sax读取xml文件举例
3-1创建一个项目 ReadXml
3-2将xml文件拷贝到根目录下.

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
</persons>

可以看出这个xml文件中有一个可以抽象出来的对象 就是person 属性有id name age
那么我们就建立一个bean
3-3:创建bean

package com.leequer.service.demo;
/**
* <person id="23">
<name>李明</name>
<age>23</age>
</person>
<person id="22">
<name>李量</name>
<age>25</age>
</person>
* @author leequer
*
* xml文件对应的bean
*/
public class Person {

private Integer id;
private String name;
private int age;

public Person ()
{}
public Person (String name ,int age)
{
this.name = name;
this.age = 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.id+",name "+this.name+" age "+this.age+"\n";
}

}



3-4:遵循mvc的架构,我们建立一个service用来读取xml

package com.leequer.service;

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


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

import org.xml.sax.XMLReader;



import com.leequer.service.demo.Person;

public class SaxReadxml {
public static List<Person> readXml(InputStream inStream)throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance(); // 初始化sax解析器
SAXParser sp = spf.newSAXParser(); // 创建sax解析器
//XMLReader xr = sp.getXMLReader();// 创建xml解析器
XMLContentHandler handler = new XMLContentHandler();
sp.parse(inStream, handler);
return handler.getPersons();
}
}



sp.parse(inStream, handler);
这句可以看出xml文件是以流的形式传进来的,参数handler就是回调函数的实例,当sax解析器解析xml文件的时候当遇到符合xml的内容就会去handle类中调用对应的上面提到的方法.那我们建立这个XMLContentHandler 就要求这个类要实现ContentHandler()这个接口,但是这个接口中有很多需要实现的方法.sax提供了一个DefaultHandler接口 只要实现这个接口中你感兴趣的方法就可以了.

3-5:创建XMLContentHandler 并完成读取时的事件的实现 注意看注释

package com.leequer.service;

import java.util.ArrayList;
import java.util.List;

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

import com.leequer.service.demo.Person;

public class XMLContentHandler extends DefaultHandler {
private List<Person> persons;

private Person person;
private String tempString;
private static final String NAMESTRING = "name";
private static final String AGESTRING = "age";
private static final String PERSONSTRING = "person";
private static final String IDSTRING = "id";

public List<Person> getPersons() {
return persons;
}

/**
* sax 解析文件不带记忆,只读取 对xml文件中的 <person id="23"> <name>李明</name> <age>23</age>
* </person> <person id="22"> <name>李量</name> <age>25</age> </person> 这部分感兴趣
* 那么这部分包含了person这个节点元素的开始和结尾,那么就要有startElement和endElement
* 这两个方法;还有text的节点元素,(就是像节点之间的回车和空格还有标签中的像李明这样的文字都是文本节点 元素
* (text节点元素)那么要解析文本节点元素就要用到characters 这个方法来获取信息。)
*/
/**
* 要开始读取xml文件的时候调用的方法
* 初始化persons
*/
@Override
public void startDocument() throws SAXException {
//这里做list的初始化工作
persons = new ArrayList<Person>();
}

/**
* sax 读取到文本节点的时候调用了这个方法
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {

if (person != null) {
String valueString = new String(ch, start, length);
if (NAMESTRING.equals(tempString)) {
// 如果当前解析到的节点是name 就要将name中的文本节点元素的值得到
person.setName(valueString);
} else if (AGESTRING.equals(tempString)) {
person.setAge(new Integer(valueString).intValue());
}
}
}
/**
* sax 读取到元素节点的时候用到这个方法;
*/
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// 先判断读到的元素是否是person
if (PERSONSTRING.equals(localName)) {
// 如果读到的是person这个元素 就要保存起来,保存在我们创建的那个person的类中 所以我们要new一个person类
person = new Person();
// attributes是属性。
person.setId(new Integer(attributes.getValue(IDSTRING)));
}
tempString = localName;

}
/**
* 这个方法是每次遇到结束的标签都会执行的 并不是只遇到最后的结尾才调用
*
* 读取完毕遇到person'的结尾 就将封装好的一个personbean保存到list中 并且清空person对象
*
*/

@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if(PERSONSTRING.equals(localName)&&person!=null)
{
persons.add(person);
person = null;
}
tempString = null;

}




}



3-6:写个测试类来实验 将xml文件装载入 然后读取

package com.leequer.readxml;
/**
* 测试类
*/
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import com.leequer.service.SaxReadxml;
import com.leequer.service.demo.Person;

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

public class SaxReadxmlTest extends AndroidTestCase {
private String PERSONSTRING = "ObjectPerson";
public void testReadXml() throws Exception
{//类装载器
InputStream inputStream = SaxReadxmlTest.class.getClassLoader().getResourceAsStream("NewFile.xml");

List <Person> personsList = SaxReadxml.readXml(inputStream);

for (Iterator iterator = personsList.iterator(); iterator.hasNext();) {
Person person = (Person) iterator.next();
Log.i(PERSONSTRING, person.toString());
}

}
}


本文是从他处转载而来,原文链接
[url]http://leequer.iteye.com/blog/653148[/url]
Android中使用SAX解析XML文件的编程方法 在上面的代码中,我们在MainActivity类中创建了一个XMLParserTask内部类,它扩展了AsyncTask类。在上述代码中,我们创建了一个名为XMLParser的类,它继承自DefaultHandler类,这是SAX解析器的基类。在上面的代码中,我们创建了一个XMLParser类,它继承自DefaultHandler类,这是SAX解析器的基类。通过使用SAX解析器,我们可以有效地解析大型XML文件,因为它在解析过程中一次只处理一个元素Android中使用SAX解析XML文件的编程方法。 阅读详情

相关推荐

西门子828D/840DSL数控机床产量数据采集实战:手把手教你绕过授权限制(附Demo源码)

本文详细介绍了西门子828D/840DSL数控机床产量数据采集的实战技术,包括绕过授权限制的替代方案和实现方法。通过分析通信协议、配置参数和数据处理,提供了一套高效且合规的数据采集解决方案,并附有Demo源码,帮助技术人员快速上手。

weixin_28278377的博客 762

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

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

Android-Idea 5541

python-snap7 报错:can‘t find snap7 library. If installed, try running ldconfig

1、使用场景: Python 读取西门子 S7 系列 PLC 信息,会用到 snap7 库,网上也有很多案例。但是,运行时会报错:can't find snap7 library. If installed, try running ldconfig 2、解决方案: A、下载项目需要依赖的 dll、lib 文件: i、Sourceforge下载:https://sourceforge.net/projects/snap7/files/ ii、优快云下载(免费):https://dow.

蜡笔小新历险记的博客 3648

android中sax解析xml,Android SAX方式解析xml文件

之前我们讲过pull方式解析xml文件的方法了,今天我们将学习下如何通过sax方式解析xml文件。我们需要定义一个自己的类让其继承DefaultHandlerprivate class MyHandler extends DefaultHandler{private String nodeName=null;private StringBuilder id=null,name=null,grade...

weixin_33613571的博客 220

多边形裁剪算法

多边形裁剪算法 刚参加工作就跟多边形刚上了,对于多边形的裁剪做一些简单的总结。 多边形裁剪主要有四种算法 Greiner-Hormann裁剪算法 Sutherland-Hodgman算法 Vatti裁剪算法 Weiler-Atherton裁剪算法 作为一名想要成为优秀算法工程师的程序员,我们不能只会使用,而不知道其原理,倘若如此,我们无法做到应用于本身业务上的定制化的修改。 Greiner–H...

papalqi 6729

VSCode + Latex 配置

1. 安装VSCode VSCode下载 next,next就安装好了。 2. 配置VSCode 2.1 安装LaTeX Workshop插件 install,安装LaTeX Workshop插件 2.2 修改 user setting 点击左下角,进入用户设置 点击上图标记的部分,选择 打开settings.json 具体配置文件如下: { "latex-workshop.la...

一只特立独行的猪 10万+

Android--用SAX解析xml文件

主运行类 package com.mrzhu.test31; import java.io.InputStream; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import android.app.Activity; import a

zlQQhs(莫落)的专栏 2777

【Qt图书管理系统】5.完整版源码及下载地址

Qt图书管理系统完整源码下载。

小鱼酱的博客 7001

安卓使用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

delphi 调用deepseek r1 api 并流式返回结果

摘要:本文展示了一个使用Delphi调用DeepSeek API的代码示例,包含两种调用方式:一次性获取结果和流式返回结果。代码实现了完整的API请求处理,包括HTTP客户端设置、JSON数据处理和UI界面交互。其中流式调用通过TStreamReader处理服务器发送事件(SSE),实时更新到TRichEdit控件并保持滚动条位置。文章还提到界面美化优化,为Delphi开发者提供了调用AI服务的实用参考方案。(150字)

全粘工程师 491

【机器学习与数据挖掘实战 | 医疗】案例18:基于Apriori算法的中医证型关联规则分析

本案例针对三阴乳腺癌患者,经问卷调查收集数据并筛选处理形成原数据,经清洗、特征选择与变换后,构建Apriori模型,基于业务理解与建模结果,分析患者症状与中医证型关联,并据症状给出建议 。

Morse_Chen的博客 1380

安卓解析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

GVINS数据采集(u-blox fp9 + D435i)

1、配置千寻的RTK账号 采集数据当天购买千寻的RTK账号,然后在Window下,输入账号和密码 (具体的步骤如之前面连接所示),查看u-center软件上的信息,确保接收机可以收到RTK信息; 2、查看Linux系统下u-blox是否可以正常接受GPS信号和RTK数据流 1、GPS信号信息 // 打开端口 1 cd ublox_f9p/src // 或者在终端1下也可以 source devel/setup.bash r.....................

努力努力努力 2609

Android中SAX解析XML文件

一、在assets文件中写一个xml文件 [html] view plaincopyprint? xml version="1.0" encoding="UTF-8"?> persons> person id="23"> name>李明name> age>30age> person> person id="20"> name>李向梅name> age

Fine。晨曦~-[清晨] の第一缕阳光 942

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android利用SAX解析XML文件

在Android中解析XML文主要有三种方式,分别为Simple API for XML(SAX)、Document Object Model(DOM)和Android附带的PULL解析器。其中SAX是一个解析速度非常快并且占用内存少的XML解析器,非常适合Android手机等移

降龍 3784

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android用sax解析xml,Android中使用sax解析xml文件的方法

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

weixin_39688378的博客 153

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android演示解析xml文件-SAX

Android下支持几种方式解析xml文件。其中SAX(Simple API for XML)由于解析速度快(文本形式解析)、占用内存少(不用将文件全部载入内存,行扫描)等优点,在需要对XML仅进行读操作、XML文件较大等情况下使用较多。本文将着重介绍SAX。 首先我们

「行到水穷处,坐看云起时」 1013

Android中使用sax解析xml文件的方法

原文地址:http://www.jb51.net/article/36146.htm

a5597942的专栏 435

android SAX 解析Xml 文件

终效果图 代码结构图: 代码详解: main.xml [xhtml:collapse] + expand sourceview plaincopy beauties.xml [xhtml] view plaincopy xml version="1.0" encoding="utf-8"?>  beauties >      bea

greatmind829的专栏 1436

android sax解析xml 文件 动态加载标题

要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序。这个程序会在以后讲解。 现在截图 已经写好的xm文件格式如下 有一个属性 id 就是为了取出标题,每个章节是独一无二的 l 我们想做的是把他动态的加载到listview 每一个子选项中 如上图所...

aex21863的博客 131

android之sax解析xml文件

林志玲28杨幂23beauties.xml

梦中一夜下江南 5410

Android中利用SAX解析XML文件

1.什么是SAX答:Android平台解析XML主要是使用SAX这么一个标准。日常开发中有两种常见方式解析XML,一种是SAX;另一种就是DOM(文档对象模型),把XML文档看做一棵树,有根节点,子节点和叶节点,首先要把XML文档全部装载在内存中,然后解析成一棵树,在树上进行相应

黑色翅膀的专栏 1134
上一篇: Android之拨号器
下一篇: Android采用Pull解析和生成xml文档
lk231_java
博客等级 码龄15年 0粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值