解析XML
除了可以用SAX和DOM解析XML文件,也可以使用android系统内置的pull解析器解析XML文件,pull解析器的运行方式跟SAX解析器相似。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。pull使用parser.next()进入下一个元素并触发相应的事件。调用parser.nexttext()可以获得下一个Text类型元素的值。
pull有5个事件:
START DOCUMENT
START_TAG
TEXT
END_TAG
END_DOCUMENT
事件是next方法的返回值。
步骤:
1.创建解析器:
XmlPullParser parser=Xml.newPullParser();
2.设置输入文件:
Parser.setInput(inStream,"UTF-8");
3.开始解析:
int event=parser.getEventType();//得到第一个事件
具体代码:
XML文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>lucky</name>
<age>18</age>
</person>
<person id="2">
<name>xiaoxiao</name>
<age>23</age>
</person>
<person id="3">
<name>hello</name>
<age>1</age>
</person>
</persons>
package cn.itcast.pullxml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
public class PullPersonService {
public static List<Person> getPersons(InputStream in)throws Exception{
Person person=null;
List<Person>persons=null;
XmlPullParser parser=Xml.newPullParser();
parser.setInput(in,"UTF-8");
int event=parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT){
switch(event){
case XmlPullParser.START_DOCUMENT:
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if("person".equals(parser.getName())){
int id=new Integer(parser.getAttributeValue(0));
person=new Person();
person.setId(id);
}
if(person!=null){
if("name".equals(parser.getName())){
person.setName(parser.nextText());
}
if("age".equals(parser.getName())){
person.setAge(new Integer(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){
persons.add(person);
person=null;
}
break;
}
event=parser.next();
}
return persons;
}
}
public void testPullgetPersons()throws Throwable{
InputStream in=this.getClass().getClassLoader().getResourceAsStream("XXX.xml");
List<Person> persons=PullPersonService.getPersons(in);
for(Person person:persons){
Log.i("person",person.toString());
}
}
生成XMl
在PullPersonService类中添加方法save:
public static void save(List<Person>persons,OutputStream out)throws Exception{
XmlSerializer serializer=Xml.newSerializer();
serializer.setOutput(out, "UTF-8");
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "persons");
for(Person person:persons){
serializer.startTag(null, "person");
serializer.attribute(null,"id",person.getId().toString());
serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
out.flush();
out.close();
}
简单易懂的代码;
public void testSave()throws Throwable{
File file=new File(this.getFilesDir(),"XXX.XML");
FileOutputStream out=new FileOutputStream(file);
List<Person>persons=new ArrayList<Person>();
persons.add(new Person(90,"haha",13));
PullPersonService.save(persons, out);
}