安卓入门——XML解析

XML解析的三种方式

开始自学安卓。打算用3天时间达到能看懂安卓代码的程度。那么,我们开始。
xml解析的三种方式分别是:Dom解析、Sax解析、Pull解析。其中Dom解析和Sax解析在Java ee中用到的比较多,Pull解析一般用于Android开发。

DOM解析

先加载全部代码,进行全部解析,生成树。每个元素都解析为一个Node节点 ,常用到的节点类型又分为:
——元素节点 Element
——属性节点 Attr
——文本节点 Text
——文档节点 Document
Dom解析的优点:因为分配了树型结构,可轻易进行代码的增、删、改、查。
Dom解析的缺点:一次全部读入所有代码,所占内存大,容易造成内存溢出。

XML Data
Document Bullder
Document Bullder Factuory
Document 树

先调用Document Bullder Factuor类,new一个Document Bullder对象;再用parse传递一个路径,就可以解析拿到Document。通过便签名字拿到Document中的元素,返回值是NodeList,其中有getLength() 获得节点个数、item(int index)获得节点位置

SAX解析

边读便解析,读到特定的标签时,自动调用相应方法操作。一个元素一个元素的解析
Sax解析优点:不会造成内存溢出
Sax解析优点:不能修改xml文件

XML Parser Factuory
XML Parser
XML Reader
XML
Contend Handler
Error Handler
DTD Hander
Entity Hander

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版权协议,转载请附上原文出处链接和本声明。