当前位置: 移动技术网 > 移动技术>移动开发>Android > Android App中使用Pull解析XML格式数据的使用示例

Android App中使用Pull解析XML格式数据的使用示例

2019年07月24日  | 移动技术网移动技术  | 我要评论

 pull解析xml文件的方式与sax解析xml文件的方式大致相同,他们都是基于事件驱动的。所以,利用pull解析xml文件需要下面几个步骤:

     1)通过xmlpullparserfactory获取xmlpullparser对象。

     2)通过xmlpullparser对象设置输入流。

     3)通过parser.next(),持续的解析xml文件直到文件的尾部。

下面的几个方法是经常需要的:xmlpullparserfacotry.newinstance( )    facotry.newpullparser( )   parser.setinput( )       parser.next( ).

下面通过一个例子描述上面的几个步骤:

//1.第一步,创建解析工厂
xmlpullparserfactory factory = xmlpullparserfactory.newinstance();
//设置支持命名空间
factory.setnamespaceaware(true);
//2.生成parser对象     
xmlpullparser parser = factory.newpullparser();
//3.设置输入
parser.setinput(new stringreader("<?xml version=\"1.0\" ?><poem><title>静夜思</title><author>李白</author><content>床前明月光,疑似地上霜,举头忘明月,低头思故乡</content></poem>"));
//获取输入类型
int eventtype = parser.geteventtype();
while (eventtype != xmlpullparser.end_document)
 {
   if (eventtype == xmlpullparser.start_document) {
  log.d("tag", "----"+parser.getname());
  }
   if (eventtype == xmlpullparser.start_tag) {
  log.d("tag", "----"+parser.getname());
  }
   if (eventtype == xmlpullparser.text) {
  log.d("tag", "----"+parser.gettext());
  }
   if (eventtype == xmlpullparser.end_tag) {
  log.d("tag", "----"+parser.getname());
  }
  //不断的去更新
  eventtype = parser.next();
 }

打印出的对象:

2016415151330157.png (640×238)

pull在android 集成了这种解析,性能和sax差不多,个人认为用来来比sax解析容易多了;采用事件驱动进行解析。
dom(document object model)文档对象模型:是w3c组织推荐的解析xml的一种方式;一般只能只能解析比较小的xml文件;因为dom解析是把整个xml放入内存,占用内存比较大,但对文档的
增删改查标胶容易操作。
sax(simple api for xml)不是官方的标准,但它是xml社区事实上的标准,几乎所有的xml解析器都支持它。sax解析一般适合xml的读取,sax解析是从上往下读取,一行一行来读。

来看一个完整的实例:

package com.android.xiong.documentpullxml; 
 
import java.io.ioexception; 
import java.io.inputstream; 
import java.net.httpurlconnection; 
import java.net.url; 
import java.util.linkedhashmap; 
 
import org.xmlpull.v1.xmlpullparser; 
import org.xmlpull.v1.xmlpullparserexception; 
import org.xmlpull.v1.xmlpullparserfactory; 
 
import android.app.activity; 
import android.app.progressdialog; 
import android.content.dialoginterface; 
import android.os.asynctask; 
import android.os.bundle; 
import android.view.menu; 
import android.view.view; 
import android.view.view.onclicklistener; 
import android.widget.button; 
import android.widget.textview; 
 
public class mainactivity extends activity { 
 
  textview showtxt; 
  button btshow; 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.activity_main); 
    showtxt = (textview) findviewbyid(r.id.showtxt); 
    btshow = (button) findviewbyid(r.id.showxml); 
    btshow.setonclicklistener(new onclicklistener() { 
       
      @override 
      public void onclick(view v) { 
        getbaiduxmlbooks baiduxml=new getbaiduxmlbooks(); 
        baiduxml.execute("http://bcs.duapp.com/meinvlook/books.xml"); 
      } 
    }); 
  } 
 
  // 异步任务 
  class getbaiduxmlbooks extends 
      asynctask<string, integer, linkedhashmap<string, string>> { 
 
    progressdialog progress; 
 
    // 初始化progressdialog 
    @override 
    protected void onpreexecute() { 
      progress = new progressdialog(mainactivity.this); 
      progress.settitle("提示!"); 
      progress.setmessage("正在解析百度云存储的xml"); 
      progress.setcanceledontouchoutside(false); 
      progress.setbutton(progressdialog.button_neutral, "取消", 
          new dialoginterface.onclicklistener() { 
 
            @override 
            public void onclick(dialoginterface dialog, int which) { 
              // 取消任务 
              getbaiduxmlbooks.this.cancel(true); 
              progress.dismiss(); 
            } 
          }); 
      progress.show(); 
    } 
 
    // 进行耗时操作 
    @override 
    protected linkedhashmap<string, string> doinbackground(string... params) { 
      string xmurl = params[0]; 
      linkedhashmap<string, string> map = new linkedhashmap<string, string>(); 
      url url; 
      try { 
        url = new url(xmurl); 
        httpurlconnection connection = (httpurlconnection) url 
            .openconnection(); 
        connection.setconnecttimeout(10000); 
        connection.setrequestmethod("get"); 
        inputstream instream = connection.getinputstream(); 
        // 获取xml解析器 
        xmlpullparser parser = xmlpullparserfactory.newinstance() 
            .newpullparser(); 
        parser.setinput(instream, "utf-8"); 
        int type=parser.geteventtype(); 
        //开始解析xml文件 
        while (type!= xmlpullparser.end_document) { 
          if (type == xmlpullparser.start_tag) { 
            // 获取开始标签 
            if (parser.getname().equals("书名")) { 
              //获取节点的值 
              map.put("书名", parser.nexttext()); 
            } 
            if (parser.getname().equals("价格")) { 
              map.put("价格", parser.nexttext()); 
            } 
            if (parser.getname().equals("作者")) { 
              map.put("作者", parser.nexttext()); 
            } 
            if (parser.getname().equals("性别")) { 
              map.put("性别", parser.nexttext()); 
            } 
            if (parser.getname().equals("年龄")) { 
              map.put("年龄",parser.nexttext()); 
            } 
          } 
          type=parser.next(); 
        } 
      } catch (ioexception e) { 
        e.printstacktrace(); 
      } catch (xmlpullparserexception e) { 
        e.printstacktrace(); 
      } 
      return map; 
    } 
 
    @override 
    protected void onpostexecute(linkedhashmap<string, string> result) { 
 
      for (string txt : result.keyset()) { 
        showtxt.append(txt+":"+result.get(txt)+"\n"); 
      } 
      progress.dismiss(); 
       
    } 
 
  } 
 
  @override 
  public boolean oncreateoptionsmenu(menu menu) { 
    // inflate the menu; this adds items to the action bar if it is present. 
    getmenuinflater().inflate(r.menu.main, menu); 
    return true; 
  } 
 
} 
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:tools="http://schemas.android.com/tools" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:orientation="vertical" 
  tools:context=".mainactivity" > 
   
  <button  
    android:id="@+id/showxml" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/btshowxml"/> 
 
  <textview 
    android:id="@+id/showtxt" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 
 
</linearlayout> 

<!-- 获取网络权限 --> 
<uses-permission android:name="android.permission.internet"/> 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网