一、Pull解析器介绍
pull解析类似于SAX\DOM,都是用来解析XML的方法;
二、使用Pull解析器读取XML数据
模板代码如下:
XmlPullParser parser = Xml.newPullParser(); //创建一个PULL解析器
parser.setInput(in,"UTF-8"); //读取的编码为UTF-8
int event = parser.getEventType(); //开始解析时调用
while(event!=XmlPullParser.END_DOCUMENT){
//parser.getName(); //获得当前指向的标签的标签名
//parser.getAttributeValue(0); //获得当前指向的标签的第1个属性值
//parser.nextText(); //获得当前标签的标签值
switch(event){
case XmlPullParser.START_DOCUMENT: //如果指向的是START_DOCUMENT
//处理
break;
case XmlPullParser.START_TAG: //如果指向的是START_TAG
//处理
break;
case XmlPullParser.END_TAG: //如果指向的是END_TAG
//处理
break;
}
event = parser.next(); //指向下一个标签
}
应用:读取/data/data/package/files/目录下的person.xml文件
XML文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>xiazdong-1</name>
<age>20</age>
</person>
<person id="2">
<name>xiazdong-2</name>
<age>30</age>
</person>
</persons>
从上面可以看出,<person></person>可以看做一个JavaBean,而<persons></persons>组成了一个person队列;
因此我们创建一个Person的JavaBean:
package org.xiazdong.vo;
public class Person {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int 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;
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
接下来,我们编写如下readXML方法,使得将XML文件中的数据变成一个person队列;
public class XmlService {
public List<Person> readXml(InputStream in) throws Exception {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, "UTF-8");
List<Person> list = null;
Person person = null;
int event = parser.getEventType(); //开始解析,并获取事件
/*
* 可选事件包括:
* (1)START_DOCUMENT
* (2)END_DOCUMENT
* (3)START_TAG
* (4)END_TAG
* */
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if ("person".equals(parser.getName())) {
person = new Person();
int id = Integer.parseInt(parser.getAttributeValue(0));
person.setId(id);
}
if("name".equals(parser.getName())){
person.setName(parser.nextText());
}
if("age".equals(parser.getName())){
person.setAge(Integer.parseInt(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName()))
list.add(person);
break;
}
event = parser.next(); //读取下一个
}
return list;
}
}
编写好此方法之后,我们可以测试此方法:
public class XmlTest extends AndroidTestCase{
private static final String TAG = "XmlTest";
public void testRead() throws Exception{
XmlService service = new XmlService();
List<Person> list = service.readXml(this.getContext().openFileInput("person.xml"));
Log.i(TAG, String.valueOf(list.size()));
for(Person p:list){
Log.i(TAG, p.toString());
}
}
}
三、使用Serializer解析器写入XML文件
核心代码如下:
XmlSerializer serializer = Xml.newSerializer(); //创建一个Serializer解析器
serializer.setOutput(out,"utf-8"); //设置输出流及输出的编码为UTF-8
serializer.startDocument("UTF-8",true); //输出开始文档<?xml version="1.0" encoding="UTF-8" standalone="true"?>
serializer.startTag(null,"tagname"); //输出<tagname>
serializer.attribute(null,"name","value"); //输出<tagname name="value">
serializer.text("value"); //输出<tagname></tagname>
serializer.endTag(null,"tagname");//结束标签
serializer.endDocument();//结束文档
应用:创建上面提到的person.xml文件到/data/data/package/files中
以下代码用于将person队列写入输出流文件(此处为文件输出流)
public class XmlService {
public void writeXml(List<Person> list,OutputStream out)throws Exception{
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(out, "UTF-8");
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "persons");
for(Person p:list){
serializer.startTag(null,"person");
serializer.attribute(null, "id", String.valueOf(p.getId()));
serializer.startTag(null, "name");
serializer.text(p.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(p.getAge()+"");
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
out.flush();
out.close();
}
}
public class XmlTest extends AndroidTestCase{
public void testWrite()throws Exception{
XmlService service = new XmlService();
List<Person> list = new ArrayList<Person>();
for(int i=0;i<3;i++){
Person p = new Person();
p.setId(i);
p.setName("xiazdong-"+i);
p.setAge(20+i);
list.add(p);
}
OutputStream out = this.getContext().openFileOutput("person.xml", Context.MODE_PRIVATE);
service.writeXml(list, out);
}
}
总结:使用Pull解析器读取,使用Serializer写入;