標籤:android 移動開發 xml pull
Android中解析xml是非常常用的操作,除了SAX和DOM兩種最常用的解析xml外,Android內建的Pull解析器解析XML檔案。 在Android的源碼中大量的使用Pull解析,pull不僅更加的面相對象,而且使用速度和效率更高。
Pull解析器是一個開源的java項目,既可以用於android,也可以用於JavaEE。如果用在javaEE需要把其jar檔案放入類路徑中,因為Android已經整合進了Pull解析器,所以無需添加任何jar檔案。android系統本身使用到的各種xml檔案,其內部也是採用Pull解析器進行解析的。 Pull解析器的運行方式與 SAX解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。跟SAX不同的是,Pull解析器產生的事件是一個數字,而非方法,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以擷取下一個Text類型節點的值。
下面代碼示範如何使用Pull解析器:
如有一個person.xml
<?xml version="1.0" encoding="UTF-8"?><persons><person id="23"><name>liming</name><age>30</age></person><person id="20"><name>zhangxiaoxiao</name><age>25</age></person></persons>
Person實體:
package com.andy.domain;public class Person {private Integer id;private String name;private Integer age;public Person() {}public Person(Integer id, String name, Integer age) {super();this.id = id;this.name = name;this.age = 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;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}
完成讀寫person.xml的PersonService類
package com.andy.service;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlSerializer;import android.util.Xml;import com.andy.domain.Person;public class PersonService {public static List<Person> getPersons(InputStream xml)throws XmlPullParserException, IOException {List<Person> persons = null;Person person = null;// XmlPullParser pullParser =// XmlPullParserFactory.newInstance().newPullParser();XmlPullParser pullParser = Xml.newPullParser();pullParser.setInput(xml, "UTF-8"); // 為xml設定要解析的xml資料int eventType = pullParser.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {switch (eventType) {case XmlPullParser.START_DOCUMENT:persons = new ArrayList<Person>();break;case XmlPullParser.START_TAG:if ("person".equals(pullParser.getName())) {int id = Integer.valueOf(pullParser.getAttributeValue(0));person = new Person();person.setId(id);}if ("name".equals(pullParser.getName())) {String name = pullParser.nextText();person.setName(name);}if ("age".equals(pullParser.getName())) {int age = Integer.valueOf(pullParser.nextText());person.setAge(age);}break;case XmlPullParser.END_TAG:if ("person".equals(pullParser.getName())) {persons.add(person);person = null;}break;}eventType = pullParser.next();}return persons;}public static void savePerson(List<Person> persons,OutputStream outputStream) throws IllegalArgumentException,IllegalStateException, IOException {XmlSerializer serializer = Xml.newSerializer();serializer.setOutput(outputStream, "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();outputStream.flush();outputStream.close();}}
Android開發之XML解析PULL