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());
}
}
170

被折叠的 条评论
为什么被折叠?



