您的位置:首页 > 移动开发 > Android开发

Android 解析XML文件 (SAX与PULL)

2011-05-24 12:32 375 查看
DOM解析需要预加载文档,在嵌入式开发中,内存比较紧俏,所以不推介,此处不详述!下面具体介绍怎么使用SAX与PULL解析XML文件。
 
首先创建person.xml文件(xml文件包含元素节点与文本节点)
 
<?xml version="1.0" encoding="UTF-8"?> 
<persons>
 <person id="20">
  <name>张进</name>
  <age>22</age>
 </person>
 <person id="30">
  <name>小明</name>
  <age>28</age>
 </person>
</persons>
 
在创建Person对象
 public class Person {

public int id ;
public String name ;
public int age ;

@Override
public String toString() {
return "id : "+id+" name : "+name+" age "+age ;
}

}

 
 
使用SAX解析开始:(SAX事件驱动型解析方式)public class SaxParser {

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 ;

@Override
public void startDocument() throws SAXException {
list = new ArrayList<Person>();
}

@Override
public 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 ;

}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("person".equals(localName)){
list.add(person);
person = null ;
}
tag = null ;
}

@Override
public 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 ;
}

}

}

 
 
使用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 ;
}

}

 
 
 
使用JUNIT进行单元测试
 public class TestXmlParse extends AndroidTestCase {

public void testReadXml(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
SaxParser mSaxParser = new SaxParser();
List<Person> list = mSaxParser.readXml(is);
for(Person p : list)
System.out.println(p);
}

public void TestGetPersons(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
PullParse mPullParse = new PullParse();
List<Person> list = mPullParse.getPersons(is);
for(Person p : list)
System.out.println(p);
}

}

 
 
 
说明:SAX解析比较难以理解,PULL解析是android官方采用的,代码复杂度不高,效率略高
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息