android里pull解析xml文件
2012-03-08 17:46
447 查看
首先说这个文章不是原创,最近要用到xml文件解析,以前都是sax解析的,我到网上听别人说用android内置的pull方式解析xml文件要稳定并且有效率。于是我就参考了网上几个例子,实现了一下,然后把自己认为重要的上去,不重要的就不细说了。
首先就是xml文件,我就不花哨了,直接复制网上例子的books.xml:
然后就是解析文件的相关类,这个类里主要是用到了XmlPullParser类,事实上你真正调用的是KXmlParse这个类。接口我就用普通的InputStream字节流,因为它比较通用:
在这里呢还有一点很重要,网上喜欢把xml文件和类放在一个目录里面,感觉这个倒不是采取。这里我就让在资源raw文件里面。
我发现xml的格式安排跟你的xml文件的简洁行也有很大的关系。比如我想保存一些列点可以的xml文件如下:
然是如果你这样安排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>
相关文章推荐
- android用pull解析xml文件
- android学习——使用SAX、DOM 和 PULL 解析xml文件,及使用pull生成xml文件
- Android中使用xml保存数据(xml文件序列化)及使用pull解析xml文件
- Android下Xml解析技术(四)、pull生成Xml文件
- Android开发之XML文件的解析的PULL方式解析
- Android中采用XmlPullParser解析xml文件错误的有关问题
- Android-通过网络获取xml文件使用pull解析得到服务器中的信息(新闻客户端)
- android中pull解析xml文件
- android解析xml文件之XmlPullParser
- Android下Xml解析技术(三)、pull解析Xml文件
- android pull解析XML文件
- Android之Pull解析XML文件
- android开发笔记之PULL解析xml文件
- Android 个人学习笔记之--- Pull解析XML文件
- Android学习-- 使用Pull解析XML文件
- Android 个人学习笔记之--- Pull解析XML文件
- Android中使用XmlPullParse解析xml文件
- Android 中使用XmlPullParser解析网络XML文件
- Android使用PULL解析和生成XML文件
- Android 中利用SAX ,Dom,pull解析 XML 文件