Android--xml解析(pull)


需要解析的Xml数据原型为:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>30</age>
</person>
<person id="20">
<name>李向梅</name>
<age>25</age>
</person>
</persons>

-----------------------------------------------》

package cn.android.pull.service;

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

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;
import cn.android.domain.Person;

/**
* Android 中使用pull方式解析和创建xml实现类
*
* @author Administrator
*
* 2010-6-29 下午10:02:45
*/
public class XmlPaseService {

/**
* pull方式解析xml实现方法
*
* @param is
* xml的输入流形式
* @return 返回解析后的对象集合
* @throws Exception
*/
public static List<Person> parseXml(InputStream is) throws Exception {

// 创建pull解析对象
XmlPullParser parser = Xml.newPullParser();

// 将xml文件以输入流的形式传递给 pull解析对象,并设置解析对象按照 utf-8 的编码进行解析
parser.setInput(is, "utf-8");

// pull解析对象在解析xml时,会返回一个代表解析位置的值。
// START_DOCUMENT : 开始解析文档
// START_TAG : 开始解析标签
// END_TAG : 标签结束
// END_DOCUMENT :xml文档解析结束
// 得到当前解析的位置
int type = parser.getEventType();

Person person = null;
List<Person> personList = null;

// 当没有解析的文档的末尾的时候,一直执行
while (type != XmlPullParser.END_DOCUMENT) {

// switch 解析的位置
switch (type) {
// 开始解析文档的时候,初始化对象集合
case XmlPullParser.START_DOCUMENT:
personList = new ArrayList<Person>();
break;

// 开始解析标签的时候,根据标签的不同名称。做不同操作
case XmlPullParser.START_TAG:
// 标签为person的时候,取出标签的属性id值,并保存到Person对象里
if ("person".equals(parser.getName())) {
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
} else if (person != null) {
// 当标签为name时,取出标签体里面的文本值,并保存到Person对象里
if ("name".equals(parser.getName())) {
person.setName(parser.nextText());
}
// 当标签为age时,取出标签体里面的文本值,并保存到Person对象里
if ("age".equals(parser.getName())) {
person.setAge(new Short(parser.nextText()));
}
}
break;

// 当解析到标签结束的时候执行
case XmlPullParser.END_TAG:
// 如果结束标签名是person,那么将Person对象保存到personList中
if ("person".equals(parser.getName())) {
if (person != null && personList != null) {
personList.add(person);
person = null;
}
}

break;
}

// 当前解析位置结束,指向下一个位置
type = parser.next();
}
is.close();
// 返回对象数组
return personList;
}

/**
* 使用pull创建一个xml方法
*
* @param writer
* 传入一个输出流(需要将创建后的xml输出的位置)
* @param personList
* 对象集合,用于生成xml中的具体数据
* @return 返回生成的xml数据,以字符串方式返回
* @throws Exception
*/
public static String createXml(Writer writer, List<Person> personList) throws Exception {
// 创建一个xml连接对象
XmlSerializer serializer = Xml.newSerializer();
// 将需要输出的输出流放到xml连接对象里
serializer.setOutput(writer);
// 开始创建文档
serializer.startDocument("utf-8", true);
// 创建根元素persons
serializer.startTag("", "persons");
// 变量数据集合
if (personList != null) {
for (Person person : personList) {
// 创建person标签
serializer.startTag("", "person");
// 给person标签加上id属性,值为遍历出来的Person对象的id值
serializer.attribute("", "id", person.getId() + "");
// 创建name标签
serializer.startTag("", "name");
// 给name标签加上文本元素,值为遍历出来的Person对象的name值
serializer.text(person.getName());
// 结束name标签
serializer.endTag("", "name");
// 创建age标签
serializer.startTag("", "age");
// 给age标签加上文本元素,值为遍历出来的Person对象的age值
serializer.text(person.getAge() + "");
// 结束age标签
serializer.endTag("", "age");
// 结束person标签
serializer.endTag("", "person");
}
}
// 结束persons标签
serializer.endTag("", "persons");
// 结束文档
serializer.endDocument();
// 刷新输出量的缓冲区
writer.flush();
// 关闭输出流
writer.close();
// 以字符创形式返回输出流中的数据
return writer.toString();
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值