xml解析有三种方式
dom解析,sax解析,pull解析
1-dom
DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大
2-SAX
SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。SAX解析器的工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;
3-pull
Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目,Android SDK中已经集成了Pull解析器,无需添加任何jar文件。Android系统中推荐使用Pull
SAX和PULL区别
SAX解析器
工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;
Pull解析器
工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。
pull是一个while循环,随时可以跳出,而sax不是,sax是只要解析了,就必须解析完成。
pull解析
public class XmlParserUtils {
public static List<Book> parserXml(InputStream inputStream)
throws Exception {
// [0]创建集合 把书的信息封装到集合
List<Book> lists = null;
Book book = null;
// [1]通过Xml工具类来获取xml解析器
XmlPullParser parser = Xml.newPullParser();
// [3]获取解析器后 告诉解析器具体要解析哪个xml文档
parser.setInput(inputStream, "utf-8");
// [4]通过解析器获取xml解析事件类型
int eventType = parser.getEventType();
// [5]使用循环 把我们关心的数据解析出来 这块逻辑最好不 要写1 因为阅读型不好
while (eventType != XmlPullParser.END_DOCUMENT) {
// [6]具体判断一下到底是开始标签 还是结束标签
switch (eventType) {
case XmlPullParser.START_TAG: // 代表解析到的是开始标签
// [6.1]具体判断一下到底解析的是哪个开始标签
if ("bookstore".equals(parser.getName())) {
// [6.2]创建集合对象用来存每本书的信息
lists = new ArrayList<Book>();
} else if ("book".equals(parser.getName())) {
// [6.3]当解析到book标签的时候创建book对象
book = new Book();
} else if ("name".equals(parser.getName())) {
// [6.4]获取书名 把书名存到book对象里
String name = parser.nextText();
book.setName(name);
} else if ("price".equals(parser.getName())) {
// [6.4]获取书名 把书名存到book对象里
String price = parser.nextText();
book.setPrice(price);
}
break;
case XmlPullParser.END_TAG: // 代表解析的是结束标签
if ("book".equals(parser.getName())) {
// 把book对象(javabean) 加入到集合中
lists.add(book);
}
break;
}
// [7]不到文档结尾 就一直解析
eventType = parser.next();
}
return lists;
}
}