1. 程式人生 > >【Android】pull解析xml檔案+將資料儲存為xml格式,並儲存在記憶體裡

【Android】pull解析xml檔案+將資料儲存為xml格式,並儲存在記憶體裡

在解析中,常用到的還有一種解析就是pull去解析xml格式的檔案。事實上android內部也是這樣做的。今天這個demo是來自傳智播客,可能技術已經被翻新了。

但是基礎原理還是那樣,希望基礎學習者,能夠理解,並實際寫一寫。

首先在src目錄下匯入我們將要解析的xml檔案:

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id="25">
        <name>方世玉</name>
        <age>18</age>
    </person>
    <person id="26">
        <name>方天廖</name>
        <age>18</age>
    </person>
</persons>

在接下來的步驟就是解析上面這個xml檔案。前提是我們對著這xml檔案有一定的基礎瞭解,大致知道每一句的作用及在xml中是什麼身份。

首先, <?xml version="1.0" encoding="utf-8"?>這句話是什麼呢?

這是該xml的start Document。在末尾是end Document。

<persons>是該xml的TAG,在這裡每一個物件就是一個TAG,可以這樣說。

  <name>方世玉</name> 每個標籤中間是Text。

瞭解一些基礎知識之後,我們就可以進行解析了。

	public static List<Person> Getpersonread(InputStream xml) throws Exception{
		
		List<Person> persons = null;
		Person person = null;
		XmlPullParser pullParser = Xml.newPullParser();//解析器將xml檔案讀到一個字元陣列中,然後一個一個字元解析
		//為要破解的xml設定
		pullParser.setInput(xml, "utf-8");
		int event = pullParser.getEventType();
		while(event!=XmlPullParser.END_DOCUMENT){
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				if("person".equals(pullParser.getName())){//pull指向person時,將id的值存到person物件裡。
					int id = new Integer(pullParser.getAttributeValue(0));
					person = new Person();
					person.setId(id);
				}
				if("name".equals(pullParser.getName())){//pull指向name時,將name標籤裡的text值存到person物件裡
					String name =pullParser.nextText();
					person.setName(name);
				}
				if("age".equals(pullParser.getName())){//同上
					int age =new Integer(pullParser.nextText());
					person.setAge(age);
				}
				break;
				
			case XmlPullParser.END_TAG://當event執行到END_TAG時,將person物件放到集合中,並將物件值置空。
				if("person".equals(pullParser.getName())){
					persons.add(person);
					person=null;
				}
				break;
			}
			event =pullParser.next();//這句話至關重要。
		}
		
		System.out.println("775757"+persons);
		return persons;
	}


主要就是上面的switch。一點一點來分析。

當event處理到end Document時,將迴圈結束,這樣就可以將xml檔案整個的解析完。

碰到Start Document時,將list的物件例項化出來。

當pull解析器指向Tag時,分了多種情況,每種情況,都在上面做了備註,很容易理解的。

event =pullParser.next();這句話呢,是將每次解析完一個標籤後,都往後移動,這句話使的event不停地往下解析。

最終,解析就完畢了,在MainActivity裡,你可以用TextView將解析的結果輸出來,觀察是否一致。

 
    private List<String>  init()throws Exception{
    	String a = null;
    	List<String> list = new ArrayList<String>();
    	 InputStream xml = this.getClass().getClassLoader().getResourceAsStream("tata.xml");
     	 System.out.println("********88888"+xml);
        
 			List<Person> persons = Personservices.Getpersonread(xml);
 			System.out.println("8888"+persons.get(0).getName().toString());
 			for(Person person:persons){
 				a= person.toString();
 				list.add(a);
 				System.out.println("88889999"+a);
 			}
			return list;
 			
    }


這是我寫的一個方法,用來返回list,在OnCreate方法裡,直接呼叫就可以了。

person.toString()。這是我在person這個javaBeen裡複寫的方法,目的就是方便將所有值直接輸出出來。

解析告一段落,這裡講解將集合或者 物件儲存起來,按照xml格式。

以前的文章也有講過檔案儲存,只不過,那個並不是xml格式罷了,感興趣的同學可以去看看。

閒話不多說:

public static void save(List<Person> persons,OutputStream ouStream) throws Exception{
		XmlSerializer serializer =Xml.newSerializer();//可序列化的
		serializer.setOutput(ouStream, "utf-8");
		serializer.startDocument("utf-8", true);
		serializer.startTag(null, "persons");
		for(Person person:persons){
			serializer.startTag(null, "person");
			serializer.attribute(null, "id", String.valueOf(person.getId()));
			
			serializer.startTag(null, "name");
			serializer.text(person.getName());
			serializer.endTag(null, "name");
			
			serializer.startTag(null, "age");
			serializer.text(String.valueOf(person.getAge()));
			serializer.endTag(null, "age");
			
			serializer.endTag(null, "person");
		}
		
		serializer.endTag(null, "persons");
		serializer.endDocument();
		ouStream.flush();
		ouStream.close();
	}
	



有了上面的基礎,這裡很好理解了,基本就是水到渠成。

但是,這裡我也曾經犯過錯誤就是int與String之間的轉化問題,這裡就不單獨開貼了。

String型別轉化int:

我一開始用toString(),但是結果不行,報錯。

後來又強制型別轉換,直接在後面+“”,終於可以了,包括到後來執行都沒問題,生成的xml檔案也能正常顯示。但是,注意了我上面用的並不是這個方法,為什麼呢?

因為在用pull去解析這個xml是出錯了。型別問題出錯,即使你在解析時,將其強制轉化成Int也不行。

後來就用了 String.ValueOf();這個方法了,建議用這個,上面那個方法,實在是有點野蠻,有點強逼別人的感覺。不好。

當然既然講到了型別轉換就不得不提這個了

String result = new String ("這裡是byte陣列","這裡是其編碼方式"),這個用法也是很廣泛的。