XML介紹:Extensible Markup Language,即可擴展標記語言
一、概述
Android中解析XML格式數據大致有三種方法:
- SAX
- DOM
- PULL
二、詳解
2.1 SAX
SAX(Simple API for XML)
使用流式處理的方式,它並不記錄所讀內容的相關信息。
它是一種以事件為驅動的XML API,解析速度快,占用內存少。使用回調函數來實現。
缺點是不能倒退。
2.2 DOM
DOM(Document Object Model)
是一種用於XML文檔的對象模型,可用於直接訪問 XML 文檔的各個部分。
它是一次性全部將內容加載在內存中,生成一個樹狀結構,它沒有涉及回調和復雜的狀態管理。
缺點是加載大文檔時效率低下。
2.3 PULL
Pull
內置於 Android 系統中。也是官方解析布局文件所使用的方式。
Pull 與 SAX 有點類似,都提供了類似的事件,如開始元素和結束元素。
不同的是,SAX 的事件驅動是回調相應方法,需要提供回調的方法,而后在 SAX 內部自動調用相應的方法。
而Pull解析器並沒有強制要求提供觸發的方法。因為他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。
三、比較
SAX、DOM、Pull 的比較:
內存占用:SAX、Pull比DOM要好;
編程方式:SAX 采用事件驅動,在相應事件觸發的時候,會調用用戶編好的方法,也即每解析一類 XML,就要編寫一個新的適合該類XML的處理類。DOM 是 W3C 的規范,Pull 簡潔。
訪問與修改:SAX 采用流式解析,DOM 隨機訪問。
訪問方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。
四、使用舉例
4.1 SAX 解析舉例
http://www.saxproject.org/quickstart.html
4.2 DOM 解析舉例
public class DomPersonService {
/**
* @param inStream
* @return
* @throws Exception
*/
public static List<Person> getPersons(InputStream inStream)
throws Exception {
List<Person> persons = new ArrayList<Person>();
/**
* 文檔的解析
*/
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inStream);
/**
* 操作對象樹
*/
Element root = document.getDocumentElement();//返回文檔的根元素
NodeList personNodes = root.getElementsByTagName("person");
for (int i = 0; i < personNodes.getLength(); i++) {
Element personElement = (Element) personNodes.item(i);
int id = new Integer(personElement.getAttribute("id"));
Person person = new Person();
person.setId(id);
NodeList childNodes = personElement.getChildNodes();
for (int y = 0; y < childNodes.getLength(); y++) {
if (childNodes.item(y).getNodeType() == Node.ELEMENT_NODE) {
if ("name".equals(childNodes.item(y).getNodeName())) {
String name = childNodes.item(y).getFirstChild()
.getNodeValue();
person.setName(name);
}
else if ("age".equals(childNodes.item(y).getNodeName())) {
String age = childNodes.item(y).getFirstChild()
.getNodeValue();
person.setAge(new Short(age));
}
}
}
persons.add(person);
}
inStream.close();
return persons;
}
}
public void testDOMGetPersons() throws Throwable {
InputStream inStream = this.getClass().getClassLoader()
.getResourceAsStream("person.xml");
List<Person> persons = DomPersonService.getPersons(inStream);
for (Person person : persons) {
Log.i(TAG, person.toString());
}
}
4.3 PULL解析舉例
public class PullPersonService {
/**
* ------------------------使用PULL解析XML-----------------------
* @param inStream
* @return
* @throws Exception
*/
public static List<Person> getPersons(InputStream inStream)
throws Exception {
Person person = null;
List<Person> persons = null;
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(inStream, "UTF-8");
int event = pullParser.getEventType();// 觸發第一個事件
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if ("person".equals(pullParser.getName())) {
int id = new Integer(pullParser.getAttributeValue(0));
person = new Person();
person.setId(id);
}
if (person != null) {
if ("name".equals(pullParser.getName())) {
person.setName(pullParser.nextText());
}
if ("age".equals(pullParser.getName())) {
person.setAge(new Short(pullParser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(pullParser.getName())) {
persons.add(person);
person = null;
}
break;
}
event = pullParser.next();
}
return persons;
}
}
public void testPullGetPersons() throws Throwable {
InputStream inStream = this.getClass().getClassLoader()
.getResourceAsStream("person.xml");
List<Person> persons = PullPersonService.getPersons(inStream);
for (Person person : persons) {
Log.i(TAG, person.toString());
}
}
此文在我的 Github Pages 上同步發布,地址為:Android中解析XML格式數據的方法