您的位置:首页 > 移动开发 > Android开发

android里pull解析xml文件

2012-03-08 17:46 447 查看
  首先说这个文章不是原创,最近要用到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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: