標籤:android 標籤
1、Pull解析簡介 Pull解析是Android系統內建的一種對XML的解析方式,它與SAX解析方式基本一致,都包括開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。但是它們不同的是,SAX的事件驅動是回調相應方法,需要提供回調的方法,而在SAX內部自動調用相應的方法。而Pull解析器並沒有強制要求提供觸發的方法。因為它觸發的事件並不是一個方法,而是一個數字,至於觸發的時間要不要處理,這個可以由程式員自己來決定。
2、五個常量事件 Pull解析器返回的是一個數字,類似於一個訊號。我們在Android的網路處理中,也常常使用數字作為處理的標識,比如我們常用的Handler機制。Pull解析器為我們定義了五個常量,如下:
XmlPullParser.START_DOCUMENT;(開始對文檔的解析)XmlPullParser.START_TAG;(開始對元素的解析)XmlPullParser.TEXT;(解析文本)XmlPullParser.END_TAG;(開始對元素的解析)XmlPullParser.END_DOCUMENT;(結束對文檔的解析)
最常用的方法是:
parser.getEventType(); // 觸發事件,開始解析parser.next(); // 解析下一個事件parser.getAttributeValue(); //獲得相應屬性的值
3、解析XML文檔
步驟不多說,序列化,得到方法,設定參數,開始解析。範例程式碼如下:
public static List<Person> getPersons(InputStream inStream) throws Exception{Person person = null;List<Person> persons = null;XmlPullParser pullParser = Xml.newPullParser();pullParser.setInput(inStream, "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())){int id = new Integer(pullParser.getAttributeValue(0));person = new Person();person.setId(id);}if(person!=null){if("name".equals(pullParser.getName())){person.setName(pullParser.nextText());}if("age".equals(pullParser.getName())){person.setAge(new Short(pullParser.nextText()));}}break;case XmlPullParser.END_TAG:if("person".equals(pullParser.getName())){persons.add(person);person = null;}break;}event = pullParser.next();}return persons;}
4、產生XML檔案
在SAX對XML文檔的解析中,我們提到過,SAX解析不支援檔案的修改、產生,那麼Pull解析呢?Pull解析是支援對檔案的修改的。
實現XML的序列化:
XmlSerializer serializer = Xml.newSerializer();
指定輸出介面資訊:
serializer.setOutput(outStream, "UTF-8");serializer.startDocument("UTF-8", true);
標籤的開始和結束:
serializer.startTag(null, "persons");serializer.endTag(null, "persons");
解析代碼如下:
for(Person person : persons){serializer.startTag(null, "person");serializer.attribute(null, "id", person.getId().toString());serializer.startTag(null, "name");serializer.text(person.getName());serializer.endTag(null, "name");serializer.startTag(null, "age");serializer.text(person.getAge().toString());serializer.endTag(null, "age");serializer.endTag(null, "person");}
記得關閉流檔案:
outStream.flush();outStream.close();
Android中的XML的Pull解析與產生