天天看點

采用Pull解析器解析XML内容

采用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進行解析的