Android開發之使用PULL解析和生成XML

Android開發之使用PULL解析和生成XML。

一、使用PULL解析XML

1.PULL簡介

我曾在《淺談XMl解析的幾種方式》一文中介紹瞭使用DOM方式,SAX方式,Jdom方式,以及dom4j的方式來解析XML。除瞭可以使用以上方式來解析XML文件外,也可以使用android系統內置的Pull解析器來解析XML文件。 Pull解析器的運行方式與SAX解析器相似。它提供瞭類似的事件,如開始元素和結束元素事件。使用parser.next()可以進入下一個元素並觸發相應事件。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行選擇,然後進行相應處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型元素的值。

2. 特點

(1)簡單的結構:一個接口,一個例外,一個工廠組成瞭 Pull解析器。

(2)簡單易用:Pull解析器隻有一個重要的方法next(),它被用來檢索下一個事件。而它的事件也僅僅隻有5個。

?START DOCUMENT;

?START_TAG;

?TEXT;

?END_TAG;

?END_DOCUMENT。

(3)多功能性:通用的XML解析器和多種實現,並具有可擴展性。

(4)最小的需求:為瞭與JavaME兼容和在小型設備上運作而設計,並允許創建占用非常小的內存的XMLPULL解析器。

3. 工作原理

解析XML內容的方式與SAX是相似的,同樣包括開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。但是它們不同的是,SAX的事件驅動是回調相應方法,需要提供回調的方法,而後在SAX內部自動調用相應的方法。而Pull解析器並沒有強制要求提供觸發的方法。因為它觸發的事件並不是一個方法,而是一個數字。至於觸發的事件要不要處理,由程序員自己決定。

看到這裡,讀者應該明白,為什麼Pull解析器會被集成Android裡瞭吧。並且Pull解析器,也可以用在JavaEE等非Android項目中,不一定隻拘泥於Android的開發。下面我們通過一個示例來理解一下Pull解析的過程吧。

publicstaticListgetPersons(InputStreaminStream)throwsException{

Personperson=null;

Listpersons=null;

XmlPullParserpullParser=Xml.newPullParser();

pullParser.setInput(inStream,”UTF-8”);

intevent=pullParser.getEventType();//觸發第一個事件

while(event!=XmlPullParser.END_DOCUMENT){

switch(event){

caseXmlPullParser.START_DOCUMENT:

persons=newArrayList();

break;

caseXmlPullParser.START_TAG:

if(“person”.equals(pullParser.getName())){

intid=newInteger(pullParser.getAttributeValue(0));

person=newPerson();

person.setId(id);

}

if(person!=null){

if(“name”.equals(pullParser.getName())){

person.setName(pullParser.nextText());

}

if(“age”.equals(pullParser.getName())){

person.setAge(newShort(pullParser.nextText()));

}

}

break;

caseXmlPullParser.END_TAG:

if(“person”.equals(pullParser.getName())){

persons.add(person);

person=null;

}

break;

}

event=pullParser.next();

}

returnpersons;

}

public static List getPersons(InputStream inStream) throws Exception{

Person person = null;

List 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();

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;

}

代碼說明:

1)int event =pullParser.getEventType();是Pull解析器的第一個事件。讀者可以看到,這個方法的返回值是int類型的,這就是前面所提到的Pull解析器返回的是一個數字,類似於一個信號。那麼這些信號都代表什麼意思呢? Pull解析器已經定義瞭這五個常量,而且對於事件,僅僅隻有這5個,如下:

?XmlPullParser.START_DOCUMENT (開始解析,隻執行一次);

?XmlPullParser.START_TAG (開始元素);

?XmlPullParser.TEXT (解析文本);

?XmlPullParser END_TAG (結束元素);

?XmlPullParser END_DOCUMENT (結束解析,隻執行一次)。

2 )“parser.getEventType()”觸發瞭第一個事件,根據XML的語法,也就是從它開始瞭解析文檔。那麼,怎麼樣觸發下一個事件呢?要通過Parser中最重要的方法:

parser.next();

註意:該方法是有返回值的,在Pull觸發下—個事件的同時,也獲得該事件的“信號”。通過獲得的信號進行switch操作。

3)“parsergetAttribiiteValue()”獲得相應屬性的值。它有兩種形式,可以通過屬性的索引,也可以通過(命名空間,屬性名)進行索引。

二、使用PULL生成XML

[java] view plain copy

print?

publicstaticvoidsave(Listpersons,OutputStreamoutStream)throwsException{

XmlSerializerserializer=Xml.newSerializer();

serializer.setOutput(outStream,”UTF-8”);

serializer.startDocument(”UTF-8”,true);

serializer.startTag(null,“persons”);

for(Personperson: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”);

}

serializer.endTag(null,“persons”);

serializer.endDocument();

outStream.flush();

outStream.close();

}

You May Also Like