Pull解析Xml

使用Pull解析器读取XML文件:

除了可以使用 SAX或DOM解析XML文件之外,也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与 SAX 解析器相似它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。


 

使用Pull解析器生成XML文件:

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐使用Pull解析器。

使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件,代码在下方

public static String writeXML(List<Person> persons, Writer writer){
    XmlSerializer serializer = Xml.newSerializer();
    try {
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);
      //第一个参数为命名空间,如果不使用命名空间,可以设置为null
        serializer.startTag("", "persons");
        for (Person person : persons){
            serializer.startTag("", "person");
            serializer.attribute("", "id", person.getId().toString());
            serializer.startTag("", "name");
            serializer.text(person.getName());
            serializer.endTag("", "name");
            serializer.startTag("", "age");
            serializer.text(person.getAge().toString());
            serializer.endTag("", "age");
            serializer.endTag("", "person");
        }
        serializer.endTag("", "persons");
        serializer.endDocument();
        return writer.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return nul;
}
 
 
示例代码:
package fu.dao.li.test.dao;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import android.os.Environment;
import android.util.Xml;
import fu.dao.li.test.domain.Sms;

public class XmlFile {
    
     //自定义将数据以xml文件的形式写到sd卡中
     public static boolean fileXml(List<Sms> list){
          StringBuilder sb=new StringBuilder();
          sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
          sb.append("<Smss>");
         
          for(Sms s:list){
               sb.append("<sms>");
               sb.append("<id>").append(s.getId()).append("</id>");    
               sb.append("<data>").append(s.getData()).append("</data>");
               sb.append("<time>").append(s.getTime()).append("</time>");
               sb.append("<name>").append(s.getName()).append("</name>");
               sb.append("</sms>");
          }
          sb.append("</Smss>");
          try {
               File file=new File(Environment.getExternalStorageDirectory(),"sms.xml");
               System.out.println(file);
               OutputStream out=new FileOutputStream(file);
               out.write(sb.toString().getBytes());
               out.close();
               return true;
          } catch (Exception e) {
               e.printStackTrace();
               return false;
          }
     }
    
    
     //Xml文件序列化
     public static boolean SerialzalXml(List<Sms> list){
          //创建一个xml文件的序列化
          XmlSerializer serializer=Xml.newSerializer();
          //创建一个文件
          File file=new File(Environment.getExternalStorageDirectory(),"sms2.xml");
          try {
               OutputStream out=new FileOutputStream(file);
               //初始化序列化器以什么编码写出数据
               serializer.setOutput(out, "utf-8");
               //设置xml文件以什么编码解析
               serializer.startDocument("utf-8", true);
               //设置xml文件开头标签
               serializer.startTag(null, "smss");
               for(Sms s:list){
                   
                    serializer.startTag(null, "id");
                    serializer.text(s.getId()+"");
                    serializer.endTag(null,"id");
                   
                    serializer.startTag(null, "data");
                    serializer.text(s.getData());
                    serializer.endTag(null,"data");
                   
                    serializer.startTag(null, "time");
                    serializer.text(s.getTime());
                    serializer.endTag(null,"time");
                   
                    serializer.startTag(null, "name");
                    serializer.text(s.getName());
                    serializer.endTag(null,"name");
               }
               serializer.endTag(null, "smss");
               serializer.endDocument();
               out.close();
               return true;
              
          } catch (Exception e) {
               e.printStackTrace();
               return false;
          }
     }
    
     //解析Xml文件
     public static List<Sms> PullXml() throws Exception{
    
               File file=new File(Environment.getExternalStorageDirectory(),"sms.xml");
               InputStream in=new FileInputStream(file);
              
               //创建一个xmlpull解析器
               XmlPullParser parser=Xml.newPullParser();
               //设置xml解析器的解码格式
               parser.setInput(in,"utf-8");
               Sms s=null;
               //创建一个集合存储解析到的数据
               List<Sms> list=null;
               //获取解析到的节点类型,pull解析将解析到的不同节点类型用不同的int数据来表示,如文档开始标签用1来表示
               int type=parser.getEventType();
    
               //遍历xml,如果解析到的标签类型不是xml结束标志则继续
               while(type!=XmlPullParser.END_DOCUMENT){
                    switch(type){
                    //判断是否是开始标签
                    case XmlPullParser.START_TAG:
                         if("Smss".equals(parser.getName())){
                              list=new ArrayList<Sms>();
                         }else if("sms".equals(parser.getName())){
                              s=new Sms();
                         }else if("id".equals(parser.getName())){
                              //获取下一个节点的文本数据,如果没有文本数据则返回null
                              int id=Integer.parseInt(parser.nextText());
                              //返回当前节点的文本,(在xml文件中空白区域也被当成文本数据)
                              //System.out.println("-----"+parser.getText());
                              s.setId(id);
                         }else if("data".equals(parser.getName())){
                              String data=parser.nextText();
                              s.setData(data);
                         }else if("time".equals(parser.getName())){
                              String time=parser.nextText();
                              s.setTime(time);
                         }else if("name".equals(parser.getName())){
                              String name=parser.nextText();
                              s.setName(name);
                         }
                         break;
                    //判断是否是结束标签
                    case XmlPullParser.END_TAG:
                         if("sms".equals(parser.getName())){
                              list.add(s);
                              s=null;
                         }
                         break;
                    }
                    //在解析中这句很重要,返回解析到的下一个节点类型
                    type=parser.next();
                    }
               return list;
     }
}




 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值