【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陣列","這裡是其編碼方式"),這個用法也是很廣泛的。