zoukankan      html  css  js  c++  java
  • android里pull解析xml文件

      首先说这个文章不是原创,最近要用到xml文件解析,以前都是sax解析的,我到网上听别人说用android内置的pull方式解析xml文件要稳定并且有效率。于是我就参考了网上几个例子,实现了一下,然后把自己认为重要的上去,不重要的就不细说了。

      首先就是xml文件,我就不花哨了,直接复制网上例子的books.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
    <book id="12">
    <name>thinking in java</name>
    <price>85.5</price>
    </book>
    <book id="15">
    <name>Spring in Action</name>
    <price>39.0</price>
    </book>
    </books>

      然后就是解析文件的相关类,这个类里主要是用到了XmlPullParser类,事实上你真正调用的是KXmlParse这个类。接口我就用普通的InputStream字节流,因为它比较通用:

    public class PullParseService {
    public List<Book> parseDateSource(InputStream inputStream) throws Exception{
    List<Book> books = null;
    Book book = null;
    XmlPullParser parse = Xml.newPullParser();
    parse.setInput(inputStream, "utf-8");

    int event = parse.getEventType();// Returns the type of the current event (START_TAG, END_TAG, TEXT, etc.)

    while(event!=XmlPullParser.END_DOCUMENT){
    switch (event) {
    case XmlPullParser.START_DOCUMENT:
    books = new ArrayList<Book>();//初始化books集合
    break;
    case XmlPullParser.START_TAG:
    if(parse.getName().equals("book")){
    book = new Book();
    //book.setId(Integer.parseInt(parse.getAttributeValue(0)));
    //或者这样也可以的
    book.setId(Integer.parseInt(parse.getAttributeValue(null, "id")));
    }
    if(book!=null){
    /**
    * note: 这里的if ...else if.... 不能改为 if。。。 if。。。。(原因是换成后者会出现异常,这个可能与XmlPullParser的getName()的内部实现有联系:
    * 具体的原因是KXmlParse的nextText()方法本身会调用next()函数具体的看源码,我也没有好好看)
    */
    if(parse.getName().equals("name")){
    book.setName(parse.nextText());
    }else if(parse.getName().equals("price")){
    book.setPrice(Float.parseFloat(parse.nextText()));
    }
    }
    break;
    case XmlPullParser.END_TAG:
    if(parse.getName().equals("book")){
    books.add(book);
    book = null;
    }
    break;
    default:
    break;
    }
    event = parse.next();//进入到下一个元素并触发相应事件
    }
    return books;
    }
    }

      在这里呢还有一点很重要,网上喜欢把xml文件和类放在一个目录里面,感觉这个倒不是采取。这里我就让在资源raw文件里面。

    PullParseService pullParseService = new PullParseService();
    try {
    /**
    * 1.this.getClass().getClassLoader().getResourceAsStream("book.xml");//返回InputSream,如果这样些,需要把book.xml文件放在该类文件的同一个文件夹
    * 2.如果是网络服务器上的资源,可以这样:
    * String url = "
    http://eagle.phys.utk.edu/reubendb/UTRoute.php";
    * String data = "?lat1=35952967&lon1=-83929158&lat2=35956567&lon2=-83925450";
    * String xmlUrl="";
    * new URL("").openStream(); // 返回同样是InputSream
    * 3.也就是下面这种,放在资源文件里面
    */

    books = pullParseService.parseDateSource(PullXmlTestActivity.this.getResources().openRawResource(R.raw.books));
    } catch (Exception e) {

    e.printStackTrace();
    }


      我发现xml的格式安排跟你的xml文件的简洁行也有很大的关系。比如我想保存一些列点可以的xml文件如下:

     <trkpt lat="35952967" lon="-83929158" grade="1"></trkpt>  

      然是如果你这样安排xml的内容,当数据量大的时候,真是让人无法阅读。

    <trkpt>
    <lat>45132123</lat>
    <lon>5454</lon>
    <grade>5847654</grade>
    </trkpt>



  • 相关阅读:
    【NOIP2015四校联训Day7】 题 题解(Tarjan缩点+DFS)
    【NOIP2013】火柴排队 题解(贪心+归并排序)
    【AHOI2009】中国象棋 题解(线性DP+数学)
    【HDU5869】 Different GCD Subarray Query 题解 (线段树维护区间GCD)
    【FZYZOJ】愚人节礼物 题解(状压DP)
    JavaSE 基础 第12节 基本算术运算符与模运算符
    JavaSE 基础 第11节 深入理解字符串
    JavaSE 基础 第09节 赋值与初始化
    JavaSE 基础 第08节 数据类型转换
    JavaSE 基础 第07节 变量和常量
  • 原文地址:https://www.cnblogs.com/slider/p/2385604.html
Copyright © 2011-2022 走看看