采用Pull解析器解析XML内容
現在來講一下 采用Pull解析器解析XML内容
在Android已經內建進了Pull解析器,是以無需添加任何jar檔案
Android系統本身用到的xml,其内部也是采用Pull解析器進行解析的。
下面是一個xml檔案:person.xml ,是直接放在src目錄下的
<span style="white-space:pre"> </span><?xml version="1.0" encoding="UTF-8" ?> <!-- start document -->
<persons>
<person id="23">
<name>liming</name>
<age>30</age>
</person>
<person id="20">
<name>zhangxiaoxiao</name>
<age>25</age>
</person>
</persons>
<!-- end document -->
現在寫一個在PersonService類,這是解析xml的類
/**
* 采用Pull解析器解析XML内容
* 擷取資料
* @param xml
* @return
* @throws Exception
*/
public static List<Person> getPersons(InputStream xml) throws Exception{
List<Person> persons = null;
Person person = null;
//擷取Pull解析器,兩個方法:
//一:XmlPullParser pull = XmlPullParserFactory.newInstance().newPullParser();
//二:Xml是Android提供的幫助類Xml.newPullParser()
XmlPullParser pullParser = Xml.newPullParser();
//為Pull解析器設定要解析的XML資料
pullParser.setInput(xml, "UTF-8");
int event = pullParser.getEventType();
//event事件沒到文檔結束的時候
while(event != XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_DOCUMENT:
//讀到<persons>節點:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
//讀到開始标簽時
//pullParser.getName()節點的名字
if( "person".equals(pullParser.getName()) ){
//擷取parser裡的屬性id
int id = Integer.parseInt(pullParser.getAttributeValue(0));
//new 一個Person對象
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.parseInt(pullParser.nextText());
person.setAge(age);
}
break;
case XmlPullParser.END_TAG:
//若讀到person尾節點,就把person對象add到List中,後對象設定為null
if( "person".equals(pullParser.getName()) ){
persons.add(person);
person = null;
}
break;
}
event = pullParser.next();
}
return persons;
}
用Junit單元測試類測試
先在清單檔案AndroidManifest.xml中加入:
<uses-library android:name="android.test.runner"/>
<span style="white-space:pre"> </span><instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.me_xmlandroid"
android:label="解析器解析和生成XML内容"></instrumentation>
在測試類中:
public class PersonServiceTest extends AndroidTestCase{
private static final String TAG = "PersonServiceTest";
public void testPersons() throws Exception{
//取得目前類的class對象 擷取類加載器ClassLoader ,
//用類加載器getResourceAsStream()方法從根路徑尋找這個檔案,以輸入流的方式傳回出來
InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = PersonService.getPersons(xml);
for (Person person : persons) {
Log.i(TAG, person.toString());
}
}
}
現在就可以測試一下了,是可以準确的對xml進行解析的