PULL

Pull和Sax类似,都是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Pull和Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Pull比Sax更简明,而且不需要扫描完整个流,PULL是个开源的项目, Android系统中和Pull方式相关的包为org.xmlpull.v1. PULL是个开源的项目

创建XmlPullParser,可以使用两个解析方式进行解析,通过XmlPullParserFactory创建

XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();//构造工厂实例  
sp;  XmlPullParser parser = xpf.newPullParser();//创建解析对象  

解析XML,

?xml version="1.0" encoding="utf-8"?>  
<rivers>  
 <river name="解析" length="605">  
     <introduction>  
     阿桑
     </introduction>  
      <imageurl>  
      http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg  
     </imageurl>  
   </river>  

   <river name="学习" length="200">  
     <introduction>  
    今天的PULL
     </introduction>  
      <imageurl>  
      http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg  
     </imageurl>  
   </river>  

   <river name="山东" length="168">  
     <introduction>  
      时尚的风格
     </introduction>  
      <imageurl>  
      http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg  
     </imageurl>  
   </river>  
 </rivers>  

解析

private List<River> parserXMLPULL(InputStream is)  
   {  
     List<River> list = null;  
     River river = null;  
//     XmlPullParserException  
//     XmlSerializer  

//     方式一:  
//     XmlPullParser parser = Xml.newPullParser();  
//     方法二:  
       XmlPullParserFactory xpf = null;  
       XmlPullParser parser = null;  
       try {  
            xpf = XmlPullParserFactory.newInstance();  
            parser = xpf.newPullParser();  
//          将XML文件以流的形式加入,并设置XML文件的编码方式  
//          parser.setInput(InputStrean inputStream, String inputEncoding)  
//          parser.setInput(Reader reader)  
            parser.setInput(is, "UTF-8");  
//          此时文档刚初始化,所以解析的位置在文档的开头  

            int type = parser.getEventType();//此时返回0,也就是在START_DOCUMENT  

//          返回类型START_DOCUMENT,END_DOCUMENT,START_TAG,END_TAG,TEXT  
           while(type!= XmlPullParser.END_DOCUMENT)  
           {  
               switch(type)  
               {  
               case XmlPullParser.START_DOCUMENT:  
                   //做一些初始化工作  
                   list = new ArrayList<River>();     
                   break;  
               case XmlPullParser.START_TAG:  
                   //rivers  
                   String name = parser.getName();  
                   if(name.equals("river"))  
                   {  
                       String attrName = parser.getAttributeValue(0);  
                       int attrLen = Integer.parseInt(parser.getAttributeValue(1));  
                       river = new River();  
                       river.setName(attrName);  
                       river.setLength(attrLen);  
                   }   
                   if(parser.getName().equals("introduction")&&river!=null)  
                   {  
                       String intro = parser.nextText();  
                       river.setIntro(intro);     
                   }  
                   if("imageurl".equals(parser.getName())&&river!=null)  
                   {  
                       String url = parser.nextText();  
                       river.setUrl(url);  
                   }  



                   break;  
               case XmlPullParser.END_TAG:  
                   String value = parser.getName();  
                   if(value.equals("river")&&river!=null&&list!=null)  
                   {  
//                     添加对象到list中  
                       list.add(river);  
                       river = null;  
                   }  
                   break;  
               }  
              type = parser.next();//当前解析位置结束,指向下一个位置  
           }  


            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
           } catch (XmlPullParserException e) {  
            // TODO Auto-generated catch block  
             e.printStackTrace();  
           }  

         return list;        
   }  

实体化类。
XmlSerializer类

public  String createXML(Writer writer  ,List<River> list) throws Exception  
 {  
  XmlSerializer serial =Xml.newSerializer();  

  //设置输出流的位置,本句会抛出异常  
  serial.setOutput(writer);  
  //以下开始创建XML文件  

  serial.startDocument("utf-8", true);//对应之前解析时出现的事件  
  serial.startTag("", "rivers");  

  //将list的内容写入XML文件  
  if(list!=null)  
  {  
   for(River river : list)  
   {  
       //创建river标签  
       serial.startTag("", "river");  

       //为river标签添加属性 name 和length  
       serial.attribute("", "name",river.getName());  
       serial.attribute("", "length",""+river.getLength());  

       serial.startTag("", "introduction");  
       serial.text(river.getIntro());  
       serial.endTag("", "introduction");  

       serial.startTag("", "imageurl");  
       serial.text(river.getUrl());  
       serial.endTag("", "imageurl");  

       serial.endTag("","river");  



   }  
  }  

  serial.endTag("", "rivers");  
  serial.endDocument();  

       刷新输出的缓冲区  
  writer.flush();  
  //关闭输出流  
  writer.close();  
  return writer.toString();  
 }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值