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官方採用的,代碼複雜度不高,效率略高