android xml 解析
在android開發中,經常用到去解析xml文件,常見的解析xml的方式有一下三種:SAX、Pull、Dom解析方式。
SAX特點: 解析方式是一種基於事件驅動的,消耗的內存少
Pull特點: 解析方式是一種基於事件驅動的,消耗的內存少,在android系統內部的xml解析都是用這種方式
Dom特點: dom是把全部文件讀入到內存中,這種方式很消耗內存,對於內存資源本來就很少的android手機,這種 方式不太建議使用。
個人建議: SAX和pull都比較適合mobile,Dom適合服務器解析,隨著mobile手機的內存增加,Dom也許可以使用。
SAX解析例子:
XML:
[html]
<?xml version="1.0" encoding="utf-8"?>
<users>
<user name="admin0" age="26">root0</user>
<user name="admin1" age="26">root1</user>
<user name="admin2" age="26">root2</user>
<user name="admin3" age="26">root3</user>
</users>
放在src/目錄下
SAXHandler:
[java]
package com.hualu.androidxml;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXHandler extends DefaultHandler {
private List<User> users ;
User user ;
int i = 1 ;
@Override
public void startDocument() throws SAXException {
users = new ArrayList<User>() ;
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("user".equals(localName)){
i = 2 ;
user = new User() ;
user.setName(attributes.getValue("name")) ;
user.setAge(attributes.getValue("age")) ;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("user".equals(localName)){
users.add(user) ;
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(i == 2)
user.setPassword(String.valueOf(ch,start,length)) ;
i = 1 ;
}
public List<User> getUsers() {
return users ;
}
}
SAXClient:
[java]
package com.hualu.androidxml;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import android.content.Context;
public class SAXClient {
public void parserXML(Context context) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SAXHandler handler = new SAXHandler() ;
InputStream file = SAXClient.class.getClassLoader().getResourceAsStream("user.xml");
parser.parse(file, handler) ;
List<User> users = handler.getUsers() ;
for(User user: users){
System.out.println(user.getName() + " ; " + user.getPassword() + " ; " + user.getAge());
}
} catch (Exception e) {
}
}
}
具體步驟:
1、實例化一個工廠SAXParserFactory
2、實例化SAXPraser對象,創建XMLReader 解析器
3、實例化Handler,處理器
4、注冊解析器
4、讀取文件流
5、解析文件
Pull解析例子:
XML:
[html]
<?xml version="1.0" encoding="utf-8"?>
<users>
<user name="admin0" age="26">root0</user>
<user name="admin1" age="26">root1</user>
<user name="admin2" age="26">root2</user>
<user name="admin3" age="26">root3</user>
</users>
放在res/xml目錄下。
PullXMLParser:
[java]
package com.hualu.androidxml;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.res.XmlResourceParser;
public class PullXMLParser {
private Activity activity ;
public PullXMLParser(Activity activity ){
this.activity = activity;
}
public List<User> parser(){
List<User> users = new ArrayList<User>() ;
XmlResourceParser xrParser = activity.getResources().getXml(R.xml.user);
try{
while(xrParser.getEventType() != XmlResourceParser.END_DOCUMENT) {
if(xrParser.getEventType() == XmlResourceParser.START_TAG){
String tagName = xrParser.getName() ;
if("user".equals(tagName)){
User user = new User() ;
user.setName(xrParser.getAttributeValue(null, "name")) ;
user.setAge(xrParser.getAttributeValue(null, "age")) ;
user.setPassword(xrParser.getText()) ;
users.add(user) ;
}
}
xrParser.next() ;
};
}catch (Exception e) {
}
return users ;
}
}
具體步驟:
1. 通過Resource,取得XML文件數據,實例化一個 XmlResourceParser
2. 通過 XmlResourceParser的事件判斷,解析XmL
這種方式比SAX簡單些(個人認為)。