Android 解析XML文件 (SAX与PULL)
2011-05-24 12:32
375 查看
DOM解析需要预加载文档,在嵌入式开发中,内存比较紧俏,所以不推介,此处不详述!下面具体介绍怎么使用SAX与PULL解析XML文件。
首先创建person.xml文件(xml文件包含元素节点与文本节点)
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="20">
<name>张进</name>
<age>22</age>
</person>
<person id="30">
<name>小明</name>
<age>28</age>
</person>
</persons>
在创建Person对象
public class Person {
public int id ;
public String name ;
public int age ;
@Override
public String toString() {
return "id : "+id+" name : "+name+" age "+age ;
}
}
使用SAX解析开始:(SAX事件驱动型解析方式)public class SaxParser {
public List <Person> readXml(InputStream is){
try {
SAXParser mSAXParser = SAXParserFactory.newInstance().newSAXParser();
PersonHandler mPersonHandler = new PersonHandler();
mSAXParser.parse(is, mPersonHandler);
is.close();
return mPersonHandler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
private final class PersonHandler extends DefaultHandler{
private List<Person> list = null ;
private String tag = null ;
private Person person ;
@Override
public void startDocument() throws SAXException {
list = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("person".equals(localName)){
person = new Person();
person.id = Integer.parseInt(attributes.getValue(0));
}
tag = localName ;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("person".equals(localName)){
list.add(person);
person = null ;
}
tag = null ;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tag != null){
String data = new String(ch,start,length);
if("name".equals(tag)){
person.name = data ;
}else if("age".equals(tag)){
person.age = Integer.parseInt(data);
}
}
}
public List<Person> getPersons (){
return this.list ;
}
}
}
使用PULL解析方式:
public class PullParse {
private List<Person> list ;
public List<Person> getPersons(InputStream is){
XmlPullParser mXmlPullParser = Xml.newPullParser();
Person person = null ;
try {
mXmlPullParser.setInput(is, "UTF-8");
//产生第一个事件
使用JUNIT进行单元测试
public class TestXmlParse extends AndroidTestCase {
public void testReadXml(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
SaxParser mSaxParser = new SaxParser();
List<Person> list = mSaxParser.readXml(is);
for(Person p : list)
System.out.println(p);
}
public void TestGetPersons(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
PullParse mPullParse = new PullParse();
List<Person> list = mPullParse.getPersons(is);
for(Person p : list)
System.out.println(p);
}
}
说明:SAX解析比较难以理解,PULL解析是android官方采用的,代码复杂度不高,效率略高
首先创建person.xml文件(xml文件包含元素节点与文本节点)
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="20">
<name>张进</name>
<age>22</age>
</person>
<person id="30">
<name>小明</name>
<age>28</age>
</person>
</persons>
在创建Person对象
public class Person {
public int id ;
public String name ;
public int age ;
@Override
public String toString() {
return "id : "+id+" name : "+name+" age "+age ;
}
}
使用SAX解析开始:(SAX事件驱动型解析方式)public class SaxParser {
public List <Person> readXml(InputStream is){
try {
SAXParser mSAXParser = SAXParserFactory.newInstance().newSAXParser();
PersonHandler mPersonHandler = new PersonHandler();
mSAXParser.parse(is, mPersonHandler);
is.close();
return mPersonHandler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
private final class PersonHandler extends DefaultHandler{
private List<Person> list = null ;
private String tag = null ;
private Person person ;
@Override
public void startDocument() throws SAXException {
list = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("person".equals(localName)){
person = new Person();
person.id = Integer.parseInt(attributes.getValue(0));
}
tag = localName ;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("person".equals(localName)){
list.add(person);
person = null ;
}
tag = null ;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tag != null){
String data = new String(ch,start,length);
if("name".equals(tag)){
person.name = data ;
}else if("age".equals(tag)){
person.age = Integer.parseInt(data);
}
}
}
public List<Person> getPersons (){
return this.list ;
}
}
}
使用PULL解析方式:
public class PullParse {
private List<Person> list ;
public List<Person> getPersons(InputStream is){
XmlPullParser mXmlPullParser = Xml.newPullParser();
Person person = null ;
try {
mXmlPullParser.setInput(is, "UTF-8");
//产生第一个事件
int eventType = mXmlPullParser.getEventType(); while(eventType != XmlPullParser.END_DOCUMENT){ switch (eventType) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: //得到解析器当前指向元素节点的便签名 String name = mXmlPullParser.getName(); if("person".equals(name)){ person = new Person(); person.id = Integer.parseInt(mXmlPullParser.getAttributeValue(0)); }else if(person != null){ if("name".equals(name)){ //得到解析器当前指向元素节点的下一个文本节点 person.name = mXmlPullParser.nextText(); }else if("age".equals(name)){ person.age = Integer.parseInt(mXmlPullParser.nextText()); } } break ; case XmlPullParser.END_TAG: if("person".equals(mXmlPullParser.getName())){ list.add(person); person = null ; } break ; } eventType = mXmlPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } return list ; } }
使用JUNIT进行单元测试
public class TestXmlParse extends AndroidTestCase {
public void testReadXml(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
SaxParser mSaxParser = new SaxParser();
List<Person> list = mSaxParser.readXml(is);
for(Person p : list)
System.out.println(p);
}
public void TestGetPersons(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
PullParse mPullParse = new PullParse();
List<Person> list = mPullParse.getPersons(is);
for(Person p : list)
System.out.println(p);
}
}
说明:SAX解析比较难以理解,PULL解析是android官方采用的,代码复杂度不高,效率略高
相关文章推荐
- android平台中解析xml文件:SAX、PULL
- Android中xml文件解析 SAX方式 与 PULL方式
- android应用开发之利用SAX、DOM和Pull实现对XML文件的解析并进行单元测试
- Android之解析XML文件三种方式(DOM,PULL,SAX)
- 【Android高级】XMl文件的DOM、SAX、PULL三种解析方式全解
- Android 解析XML文件 (SAX与PULL)
- Android xml文件解析 SAX,DOM,PULL
- Android 解析XML文件的三种方式 DOM,SAX,PULL
- Android 解析XML文件的三种方式 DOM,SAX,PULL
- 详解Android之解析XML文件三种方式(DOM,PULL,SAX)
- android学习——使用SAX、DOM 和 PULL 解析xml文件,及使用pull生成xml文件
- android学习——使用SAX、DOM 和 PULL 解析xml文件,及使用pull生成xml文件
- Android三种解析xml文件的方法:SAX, PULL, DOM
- android-----三种方式(sax、pull、dom)解析xml文件
- 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull)
- android解析XML总结(SAX、Pull、Dom三种方式)
- Android:使用SAX或者DOM或者pull操作XML文件
- Android下Xml解析技术(四)、pull生成Xml文件
- android_xml解析之 使用SAX读取XML文件
- Android--入门---16---(Android中xml 的生成 & 解析---DOM . SAX . PULL)