1.Pull解析簡介
Pull是Android內置的xml解析器。Pull解析器的運行方式與SAX 解析器相似。Pull解析是一種流式解析,邊讀取邊解析.從一個xml文檔自上往下進行讀取.Pull解析是一種基於事件模型的一種解析,一旦遇到一種事件就會交給程序員去處理這種事件.它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。事件將作爲數值代碼被髮送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型節點的字符串值。
2.下面舉一個例子來使用pull解析xml
2.1 首先準備要解析的xml文檔,這裏我們放到android項目的assets目錄下.取名爲books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book language="中文">
<isbn>ISBN-1234-5678-1111</isbn>
<name>小李飛刀</name>
<price>100.0</price>
<author>FioMan</author>
<publish>Tarena國際出版社</publish>
<decription>
<![CDATA[ 簡介:
(##$%^^&@@####$$$$%%%%%%) <> <>
阿斯頓發斯蒂芬阿薩發送的飛asd發射的飛
asdjflasdjfasdfjasdjfasjdfjffff
發到手機費拉sdk就飛拉薩的減肥
$%^^#%#%^#^#^#^##^#^ ]]>
</decription>
</book>
<book language="英文">
<isbn>ISBN-1234-5678-2222</isbn>
<name>東方不敗</name>
<price><100.0>50.0</price>
<author>FioMan</author>
<publish>Tarena國際出版社</publish>
</book>
<book language="日文">
<isbn>ISBN-1234-5678-3333</isbn>
<name>挪威的森林</name>
<price>99.0</price>
<author>村上村樹</author>
<publish>Tarena國際出版社</publish>
</book>
<book language="法語">
<isbn>ISBN-1234-5678-4444</isbn>
<name>只有努力才能看起來毫不費力</name>
<price>99.0</price>
<author>FioMan</author>
<publish>Tarena國際出版社</publish>
</book>
</books>
2.2 在項目中創建一個實體類Book用於存放book標籤的元素.
Book.java 如下:
public class Book
{
private String name;
private String author;
private String price;
private String isbn;
private String description;
private String publish;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAuthor()
{
return author;
}
public void setAuthor(String author)
{
this.author = author;
}
public String getPrice()
{
return price;
}
public void setPrice(String price)
{
this.price = price;
}
public String getIsbn()
{
return isbn;
}
public void setIsbn(String isbn)
{
this.isbn = isbn;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public String getPublish()
{
return publish;
}
public void setPublish(String publish)
{
this.publish = publish;
}
@Override
public String toString()
{
return "Book [name=" + name + ", author=" + author + ", price=" + price
+ ", isbn=" + isbn + ", description=" + description+ ", publish=" + publish + "]";
}
}
2.3在android項目中加入一個點擊按鈕btn_pull,點擊之後使用Pull解析剛纔的books.xml.
代碼如下:
首先說下Pull解析的流程:
1>首先是獲取XmlPullParser解析器對象.有兩種方式:
1.1>直接使用Xml類的靜態方法newPullParser()方法獲取XmlPullParser對象.
XmlPullParser parser = Xml.newPullParser();
1.2>使用解析器工廠的方式
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
2>給解析器設置輸入流.因爲這個例子裏面用的是assets裏面的原生資源.所以我們這裏是這樣設置的.
InputStream is = getAssets().open(“books.xml”);
parser.setInput(is,”utf-8”);
3>配置while循環根據事件類型邊驅動事件邊解析XML.
首先是獲取事件類型
int event = parser.getEventType();
while(event != XmlPullParser.END_DOCUMENT)
{
switch(event)
{
case XmlPullParser.START_DOCUMENT: //文檔開始
case XmlPullParser.START_TAG://開始標籤
case XmlPullParser.END_TAG://結束標籤
}
//手動觸發事件
event = parser.next();
}
下面是整個的解析代碼,然後通過log打印.
private void parseXML_PULL() throws Exception
{
//1.XmlPullParser
XmlPullParser parser = Xml.newPullParser();
InputStream is = getAssets().open("books.xml");
//2.設置xml輸入流
parser.setInput(is ,"utf-8");
//3.獲取事件,配合while循環開始解析xml文件
int event = parser.getEventType();
List<Book> books = new ArrayList<Book> ();
Book book = null;
while(event != XmlPullParser.END_DOCUMENT)
{
switch(event)
{
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
String tagName = parser.getName();
if("book".equals(tagName))
{
book = new Book();
books.add(book);
}
else if("isbn".equals(tagName))
{
book.setIsbn(parser.nextText());
}
else if("name".equals(tagName))
{
book.setName(parser.nextText());
}
else if("price".equals(tagName))
{
book.setPrice(parser.nextText());
}
else if("author".equals(tagName))
{
book.setAuthor(parser.nextText());
}
else if("publish".equals(tagName))
{
book.setPublish(parser.nextText());
}
else if("decription".equals(tagName))
{
book.setDescription(parser.nextText());
}
break;
}
//手動出發下一個事件
event = parser.next();
}
for(Book b : books)
{
Log.d("toLook", b.toString());
}
}