Android 使用pull,sax解析xml
pull解析xml文件
1.获得XmlpullParser类的引用
这里有两种方法
//解析器工厂
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser pullParser=factory.newPullParser(); //直接获得实例
XmlPullParser pullParser= Xml.newPullParser();
2.设置解析内容

通过setInput方法设置解析内容 重载写的很清楚 把xml文件读取到Reader 或 InputStream中 注意 InputStream需要指定编码
pullParser.setInput(getAssets().open("student.xml"),"utf-8");
getAssets().open("student.xml")返回一个字节流InputStream 所以需要指定编码格式
3.获取当前的事件类型 开始解析
START_DOCUMENT 开始读取文档
END_DOCUMENT 结束读取文档
START_TAG 开始读取标签
END_TAG 结束读取标签
xml数据
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person id="1">
<name>张三</name>
<age>23</age>
</person>
<person id="2">
<name>李四</name>
<age>23</age>
</person>
</persons>
pull解析核心代码
try {
//解析器工厂
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
//创建解析器
XmlPullParser pullParser=factory.newPullParser();
//直接创建解析器 //pullParser= Xml.newPullParser();
//设置解析内容
//getAssets().open("student.xml")返回一个字节流InputStream 所以需要指定编码格式
pullParser.setInput(getAssets().open("student.xml"),"utf-8");
//开始解析
//获取当前解析的标签
//获取当前事件类型:开始读取文档,开始读取标签,结束标签,结束读取文档 类似一个状态
int type=pullParser.getEventType();
while (type!=XmlPullParser.END_DOCUMENT){
switch (type){
//开始读取文档
case XmlPullParser.START_DOCUMENT:
break;
//开始读取标签
case XmlPullParser.START_TAG:
String tag=pullParser.getName();//获取节点名
if(tag.equals("person")){
person=new Person();
//获取节点属性
String id=pullParser.getAttributeValue("","id");
if (TextUtils.isEmpty(id)) continue;
person.setId(Integer.parseInt(id));
}else if(tag.equals("name")){
//获取下一个文本
String name=pullParser.nextText();
if (TextUtils.isEmpty(name)) continue;
person.setName(name);
}else if(tag.equals("age")){
String age=pullParser.nextText();
if (TextUtils.isEmpty(age)) continue;
person.setAge(Integer.parseInt(age));
}
break;
//结束读取标签
case XmlPullParser.END_TAG:
tag=pullParser.getName();
//当一个person 读取完成之后 添加到list
if(tag.equals("person")){
persons.add(person);
}
break;
//结束读取文档
case XmlPullParser.END_DOCUMENT:
break;
}
//读取下一个事件
type=pullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
这里提一下getAttributeValue()方法 获取节点属性 有两个参第一个参数代表的是命名空间 什么xml是里的命名空间呢 一般xml文件根元素附加都会有xmlns 这就定义命名空间的
给属性添加命名空间后 就表示是那个命名空间的属性 类似包名 不过不常用
SAX解析xml数据
sax对文档进行顺序扫描 当扫描到文档开始结束,元素开始结束,标签开始结束都会触发事件
sax的使用和pull差不多 个人喜欢用sax多一点,sax采用的事件驱动
sax是通过重写方法来实现,符合条件就会触发回调 这些方法都是定义在ContentHandler接口中,Android为我们提供了一个帮助类DefaultHandler,只需要继承这个类,重写方法就ok
核心代码
1 try {
//创建SAX解析器
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser= factory.newSAXParser();
//自定一个Handler解析器
PersonHandler handler=new PersonHandler();
//解析器对xml进行解析
parser.parse(getAssets().open("student.xml"),handler);
for(Person p:handler.getPersonList()){
Log.e("XmlSAXParser",p.getName()+"====="+p.getAge()+"=========="+p.getId());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
解析器代码
public class PersonHandler extends DefaultHandler {
//保存数据
private List<Person> personList;
private Person person;
//节点名称 当前解析的元素名
private String tag;
/**
* 处理xml文件中读到到文本内容
* @param ch 字符串内容
* @param start 起始位置
* @param length 长度
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
//创建成字符串
String text=new String(ch,start,length).trim();
//字符串不能为空,既不读取空的文本节点,如换行
if(TextUtils.isEmpty(text)) return;
//当节点名称等于name时赋值
if("name".equals(tag)){
person.setName(text);
}else if("age".equals(tag)){
person.setAge(Integer.parseInt(text));
}
}
/**
*
* @param uri 命名空间 没啥用
* @param localName 前缀标签名 没啥用
* @param qName 节点名字
* @param attributes 属性集合
* @throws SAXException
*/
@Override//qName attributes
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
tag=qName;
//为什么创建集合 和对象 请看上面的xml 仔细分析
if("persons".equals(qName)){
//数据存储的集合
personList=new ArrayList<>();
}else if("person".equals(qName)){
person=new Person();
String id=attributes.getValue("id");
if (!TextUtils.isEmpty(id)){
person.setId(Integer.parseInt(id));
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if("person".equals(qName)){
personList.add(person);
}
}
}
还有startElement startDocument endDocument等方法 过几天会整理一个xml和listview的简单使用的Demo
Android 使用pull,sax解析xml的更多相关文章
- Dom,pull,Sax解析XML
本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Do ...
- Android之SAX解析XML
一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...
- Android SAX解析XML
本篇讲解一下SAX解析XML这种方式,首先来看一下它的基本介绍: SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它是种解析速度 ...
- cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)
今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会 ...
- SAX解析xml浅析
SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序.使用SAX的优势在于其解析速度较快,占用内存较少(相对 ...
- 安卓SAX解析XML文件
XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...
- sax解析xml文件的DefaultHandler处理类
一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- DOM&SAX解析XML
在上一篇随笔中分析了xml以及它的两种验证方式.我们有了xml,但是里面的内容要怎么才能得到呢?如果得不到的话,那么还是没用的,解析xml的方式主要有DOM跟SAX,其中DOM是W3C官方的解析方式, ...
随机推荐
- Java集合---ConcurrentHashMap原理分析
集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap).这篇文章主 ...
- Xamarin体验:使用C#开发iOS/Android应用
Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 简介 Xamarin是基于Mo ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- APP开放源码第一弹《纳豆》
2016年7月2日,这是一个风轻云淡的日子,DeviceOne平台的用户Star将自己经过一段时间研发的产品通过官方的渠道开源出来,这不仅是对自己设计的高度自信.更是想体现一下自己对于DeviceOn ...
- 云计算之路-阿里云上:“黑色1秒”最新线索——w3tp与w3dt
向大家分享一下最近排查“黑色1秒”问题的进展,“黑色1秒”的问题表现详见什么是黑色1秒. 1. 发生在w3wp进程内 判断依据:“黑色1秒”期间,http.sys的HTTP Service Reque ...
- ASP.NET MVC 视图(三)
ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...
- ASP.NET MVC 视图(二)
ASP.NET MVC 视图(二) 前言 上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个 ...
- 【Win10 应用开发】集成文件打开选择器
有朋友给老周提出建议:老周,能不能在写博客时讲一下有深度的小故事?技术文章谁不会写.讲一下对人生有启发性的故事会更好. 哎呀,这要求真是越来越高了.好吧,尽量吧,如果有小故事的话,老周在就每次写博客时 ...
- 单例模式——创建型模式01
1. 名称 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类.单例模式是一种对象创建型模式. 2. 问题 ...
- ASP.NET Core管道深度剖析[共4篇]
之所以称ASP.NET Core是一个Web开发平台,源于它具有一个极具扩展性的请求处理管道,我们可以通过这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET Core应用的很多特性,比 ...
