您的位置:首页 > 移动开发 > Android开发

Android利用XmlPullParse对XML进行解析读取(一)

2013-08-28 16:38 387 查看
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解析器相关的错误。

这是我自己建的一个xml文件person.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>小明</name>
<age>25</age>
</person>
<person id="2">
<name>哈哈</name>
<age>76</age>
</person>
</persons>
大家注意一下我存放XML的位置



好了,现在的目的就是把person.xml里的内容解析出来,看一下xml内容利用我们的面向对象的知识,我们需要建立一个实体类来存放解析出来的信息

所以先来建立一个Person类。



package com.wjg.xml.entity;

public class Person {
public Person() {
super();
}
public Person(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
private Integer id;
private String name;
private Integer 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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}

}


好了,实体类建好之后需要开始解析xml的步骤,建一个Service(这里其实应该抽象出一个接口来,让自己写的service实现这个接口,懒得写了。呵呵)

package com.wjg.xml.service;

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

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.Xml;

import com.wjg.xml.entity.Person;

public  class PollXmlService {
public  static final List<Person> readXml(InputStream xml) throws Exception{
//通过XmlPullParserFactory获取XmlPullParser对象
//XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
//XmlPullParser xParser=factory.newPullParser();

XmlPullParser xmlPullParser=Xml.newPullParser();
//为Pull解析器设置输入流和编码格式
xmlPullParser.setInput(xml, "UTF-8");
//获取XMl读取的位置
int eventType=xmlPullParser.getEventType();

List<Person> persons=null;
Person person=null;
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if(xmlPullParser.getName().equals("person")){
person=new Person();
person.setId(Integer.parseInt(xmlPullParser.getAttributeValue(0)));
}else if(xmlPullParser.getName().equals("name")){
person.setName(xmlPullParser.nextText());
}else if(xmlPullParser.getName().equals("age")){
person.setAge(Integer.parseInt(xmlPullParser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if(xmlPullParser.getName().equals("person")){
persons.add(person);
person=null;
}
break;
case XmlPullParser.END_DOCUMENT:
xml.close();
}
eventType=xmlPullParser.next();
}
return persons;
}
}


方法写完了,咱们来测试一下。在项目清单文件中添加测试库。



建立测试类

package com.wjg.xml.test;

import java.io.InputStream;
import java.util.List;
import android.test.AndroidTestCase;
import android.util.Log;
import com.wjg.xml.entity.Person;
import com.wjg.xml.service.PollXmlService;

public class TestXml extends AndroidTestCase{
private final static String TAG="TestXml";
public void testReadXml() throws Exception{
/**
* xml文件放在src目录下,编译时会放在类路径下,所以通过类加载器的getResouceAsStream方法
* 可获得文件的输入流
*/
InputStream is=this.getContext().getClassLoader().getResourceAsStream("person.xml");
//调用方法,执行读取操作
List<Person> persons=PollXmlService.readXml(is);
for (Person person : persons) {
//LogCat控制台输出person信息
Log.i(TAG, person.toString());
}
}
}

现在右击测试方法,选择Android JunitTest,切换到DDMS控制台。查看LogCat输入的日志



成功了,PULL解析XML文件就是这么简单(LogCat控制台我使用了过滤器,过滤我定义的Tag,所以只显示我想看到的信息)。

大家互相学习。初次研究Android,有好的建议提出来,和大家共勉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: