XML解析的三种方式
开始自学安卓。打算用3天时间达到能看懂安卓代码的程度。那么,我们开始。
xml解析的三种方式分别是:Dom解析、Sax解析、Pull解析。其中Dom解析和Sax解析在Java ee中用到的比较多,Pull解析一般用于Android开发。
DOM解析
先加载全部代码,进行全部解析,生成树。每个元素都解析为一个Node节点 ,常用到的节点类型又分为:
——元素节点 Element
——属性节点 Attr
——文本节点 Text
——文档节点 Document
Dom解析的优点:因为分配了树型结构,可轻易进行代码的增、删、改、查。
Dom解析的缺点:一次全部读入所有代码,所占内存大,容易造成内存溢出。
先调用Document Bullder Factuor类,new一个Document Bullder对象;再用parse传递一个路径,就可以解析拿到Document。通过便签名字拿到Document中的元素,返回值是NodeList,其中有getLength() 获得节点个数、item(int index)获得节点位置
SAX解析
边读便解析,读到特定的标签时,自动调用相应方法操作。一个元素一个元素的解析
Sax解析优点:不会造成内存溢出
Sax解析优点:不能修改xml文件
XML Reader:处理器;代码中必须要调用的
Handler:处理者,及所需要的方法。默认下不执行
通过XMLreader解析xml文档。解析一个类,从Contend Handler调用一个相应的方法。
PULL解析
与SAX解析逻辑相同,但更为简单。以下为基本代码;
public class PullParserText{
public void pullText() throws Exception{
ArrayList<Book>books=null;
Book book=null;
//获取工厂
XMLEventFactory parserFactory=XMLEventFactory.newInstance();
//获取XML解析器
XmlPullParser parser=parserFactory.newPullParser();
//给解析器设置一个输入源
//第一个参数输入流 第二个参数 文档用到的字符编辑码
parser.setInput(new FileInputStream(new File("book.xml")),"UTF-8");
//获取当前事件类型
int eventType=parser.getEventType();
while (eventType!=XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
//开始标签
//parsera.getName获取当前事件对应的元素名
if("书架".equals(parser.getName())){
//创建一个集合
books=new ArrayList<>0;
}else if("书"。equals.getName()){
//创建一个book对象
book=new Book();
}else if("书名"。equals.getName()){
//给book对象设置书名属性
book.setTitle(parser.nextText());//parser.nextText()获取当前节点的下一个文本内容
}else if("作者"。equals.getName()){
//给book对象设置作者属性
book.setAuthor(parser.nextText());
}else if("售价"。equals.getName()){
//给book对象设置售价属性
book.setPrice(parser.nextText());
}
break;
ccase XmlPullParser.END_TAG.
//结束标签
if("书".equals(parser).getName()){
//把book对象添加到集合中
books.add(book);
}
break;
}
//调用parser.next方法解析下一个元素,用这个结果来更新eventType如果解析到文档结束,就会退出
//如果不更新eventType就是死循环
eventType=parser.next();
}
//遍历集合
for(Book book1:books){
System.out.println(book1);
}
}
}
}开始标签是书架,创建书架集合;开始标签是书,创建书对象;开始标签是书名,售价等,设置书的属性。
版权声明:本文为weixin_44593338原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。