Android 解析XML文件 (SAX与PULL)

来源:互联网 发布:gpt转mbr数据会丢失吗 编辑:程序博客网 时间:2024/04/30 04:53

一、首先创建一个需要解析的person.xml 文件

<?xml version="1.0" encoding="UTF-8"?><persons><person id="20"><name>MacDroid</name><age>22</age></person><person id="30"><name>Vect</name><age>28</age></person></persons>

二、创建Person.java用来对应解析出来的对象

public class Person {public int id;public String name;public int age;@Overridepublic String toString() {return "id : " + id + " name : " + name + " age " + age;}}

三、这一点是关键,解析刚才创建的person.xml文件

1)使用SAX解析方式

public class SAXParse {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;@Overridepublic void startDocument() throws SAXException {list = new ArrayList<Person>();}@Overridepublic 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;}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if ("person".equals(localName)) {list.add(person);person = null;}tag = null;}@Overridepublic 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;}}}
(2)使用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;}}
最后自己的定义Activity中测试这两种解析方式

public class SAXParseDemoActivity extends Activity {/** Called when the activity is first created. */@Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        try{        testSAXParse();        testPullParse();        }catch(Exception e){                }    }public void testSAXParse() throws IOException {  InputStream is =this.getAssets().open("person.xml"); SAXParse mSaxParser = new SAXParse();  List<Person> list = mSaxParser.readXml(is);  Log.i("testSAXParse", "size = " + list.size());for(Person p : list)  System.out.println(p);  }  public void testPullParse() throws IOException{InputStream is =this.getAssets().open("person.xml"); PullParse mPullParse = new PullParse();List<Person> list = mPullParse.getPersons(is);Log.i("testPullParse", "size = " + list.size());for(Person p : list)  System.out.println(p);  } }

最后运行出来的结果:

I/System.out( 1943): id : 20 name : MacDroid age 22
I/System.out( 1943): id : 30 name : Vect age 28
I/testPullParse( 1943): size = 2
I/System.out( 1943): id : 20 name : MacDroid age 22
I/System.out( 1943): id : 30 name : Vect age 28



代码实现下载地址:http://download.csdn.net/my/uploads