加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Pull解析xml文件

发布时间:2020-12-16 00:34:28 所属栏目:百科 来源:网络整理
导读:Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里

Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析。看实例:

book.xml如下:

Xml代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <books>
  3. bookid="12"name>thinkinginjava</price>85.5bookbookid="15">SpringinAction>39.0>

Pull解析的代码如下PullParseService.java

Java代码
    importjava.io.InputStream;
  1. importjava.util.ArrayList;
  2. importjava.util.List;
  3. importorg.xmlpull.v1.XmlPullParser;
  4. importandroid.util.Xml;
  5. importcom.xtlh.cn.entity.Book;
  6. publicclassPullParseService{
  7. staticList<Book>getBooks(InputStreaminputStream)throwsException{
  8. List<Book>books=null;
  9. Bookbook= XmlPullParserparser=Xml.newPullParser();
  10. parser.setInput(inputStream,"UTF-8");
  11. intevent=parser.getEventType();//产生第一个事件
  12. while(event!=XmlPullParser.END_DOCUMENT){
  13. switch(event){
  14. caseXmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件
  15. books=newArrayList<Book>();//初始化books集合
  16. break;
  17. caseXmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件
  18. if("book".equals(parser.getName())){//判断开始标签元素是否是book
  19. book=newBook();
  20. book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id
  21. }
  22. if(book!=null){
  23. if("name".equals(parser.getName())){//判断开始标签元素是否是name
  24. book.setName(parser.nextText());
  25. }elseif("price".equals(parser.getName())){//判断开始标签元素是否是price
  26. book.setPrice(Float.parseFloat(parser.nextText()));
  27. caseXmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件
  28. //判断结束标签元素是否是book
  29. books.add(book);//将book添加到books集合
  30. event=parser.next();//进入下一个元素并触发相应事件
  31. }//endwhile
  32. returnbooks;
  33. }

里面使用到的Book.java类

classBook{
  • privateintid;
  • privateStringname;
  • floatprice;
  • intgetId(){
  • returnid;
  • voidsetId(intid){
  • this.id=id;
  • publicStringgetName(){
  • returnname;
  • voidsetName(Stringname){
  • this.name=name;
  • floatgetPrice(){
  • returnprice;
  • voidsetPrice(floatprice){
  • this.price=price;
  • @Override
  • publicStringtoString(){
  • returnthis.id+":"+this.name+":"+this.price;
  • 测试使用的是android的单元测试,代码如下:

    importandroid.test.AndroidTestCase;
  • importandroid.util.Log;
  • importcom.xtlh.cn.service.PullParseService;
  • classtestPullParseServiceextendsAndroidTestCase{
  • staticfinalStringTAG="testPullParseService";
  • voidtestPull() InputStreaminput=this.getClass().getClassLoader().getResourceAsStream("book.xml");
  • PullParseServicepull=newPullParseService();
  • List<Book>books=pull.getBooks(input);
  • for(Bookbook:books){
  • Log.i(TAG,book.toString());
  • 要使用android的单元测试,需要在AndroidManifest.xml文件中加入声明,AndroidManifest.xml如下:

    Xml代码
      xmlversion="1.0"encoding="utf-8"manifestxmlns:android="http://schemas.android.com/apk/res/android"
    1. package="com.xlth.cn.demo"
    2. android:versionCode="1"
    3. android:versionName="1.0"applicationandroid:icon="@drawable/icon"android:label="@string/app_name"uses-libraryandroid:name="android.test.runner"/>
    4. activityandroid:name=".PullParseDemo"
    5. android:label="@string/app_name"intent-filteractionandroid:name="android.intent.action.MAIN"categoryandroid:name="android.intent.category.LAUNCHER"activityapplicationuses-sdkandroid:minSdkVersion="7"instrumentationandroid:name="android.test.InstrumentationTestRunner"
    6. android:targetPackage="com.xlth.cn.demo"android:label="TestsforMyApp"manifest>
    原文:http://www.iteye.com/topic/763949

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    • 推荐文章
        热点阅读