欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-31 16:00:46
 pull解析xml文件的方式与sax解析xml文件的方式大致相同,他们都是基于事件驱动的。所以,利用pull解析xml文件需要下面几个步骤:  &n...

 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();
 }

打印出的对象:

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

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"/>