在安卓中最常用的解析方式应该是pull解析,它自身比较方便,可以灵活控制读取节点的开始和停止。
那么具体怎么用pull来解析xml文档呢?
首先我们来看一个比较简单的xml文件是什么样的:
如下:名字为book.xml的文档
<?xml version="1.0" encoding="utf-8"?>
<resources>
<book id="1">
<name>java</name>
<price>20</price>
</book>
<book id="2">
<name>android</name>
<price>30</price>
</book>
</resources>
我们可以看到这个名字叫book.xml的文档最上面有一个声明语句
这句话呢就对应着解析文档的开始。
那么我们最终能够解析出来一个什么样子的东西,才叫xml的解析呢?
就以上xml,我希望能够解析出一本书的名字和价格,就可以了,其他的都不重要。
好了,开始解析。
一、新建一个Book类用来存放解析出的数据
public class Book {
String name;
String price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
@Override
public String toString() {
return "name:"+name+"\n"+"price"+price;
}
}
二、建立一个接口,接口中包含解析的方法
public interface PullParser {
/**
*
* 解析输入流,获取Beauty列表
* @param is
* @return
* @throws Exception
*/
public List<Book> parse(InputStream is) throws Exception;
/**
*
* 序列化Beauty对象集合,得到XML形式的字符串
* @param beauties
* @return
* @throws Exception
*/
public String serialize(List<Book> beauties) throws Exception;
}
三、建立解析类,继承自接口(目的是封装解析的方法)
public class ParserXml implements PullParser {
List<Book> books;
Book book;
@Override
public List<Book> parse(InputStream is) throws Exception {
// 由android.util.Xml创建一个XmlPullParser实例
XmlPullParser xpp = Xml.newPullParser();
// 设置输入流 并指明编码方式
xpp.setInput(is,"UTF-8");
//获取标签的类型
int eventType=xpp.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType){
//判断是否为文档开始
case XmlPullParser.START_DOCUMENT:
//初始化list集合
books=new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if(xpp.getName().equals("book")){//判断开始标签是否为book
book=new Book();
eventType=xpp.next();
}else if(xpp.getName().equals("name")){
eventType=xpp.next();//让evenType指向name的下一个标签
book.setName(xpp.getText());
}else if(xpp.getName().equals("price")){
eventType=xpp.next();
book.setPrice(xpp.getText());
}
break;
//判断当前标签是否为文件结束标签
case XmlPullParser.END_TAG:
if(xpp.getName().equals("book")){
books.add(book);//将book存入list集合
}
break;
}
eventType=xpp.next();
}
return books;
}
@Override
public String serialize(List<Book> beauties) throws Exception {
return null;
}
}
四、最后在Mainactivity中获取xml文件并调用解析方法
mlist=new ArrayList<>();
xml=new ParserXml();
try {
mlist=xml.parse(is);
mTextView.setText(mlist.toString());
} catch (Exception e) {
e.printStackTrace();
}