編輯:Android開發實例
前言
在上一篇文章已經介紹了Android解析XML的幾種方式,分別有:SAX、DOM、PULL。詳細的可以看看上一篇文章:http://www.fengfly.com/plus/view-213372-3.html。這篇就介紹一下PULL解析XML。
XMLPULL的一些特點:
關鍵方法next()
對於XMLPULL,只有一個關鍵的next()方法需要了解一下,它是用於檢索下一個事件,並有五個事件,這五個分別是:
雖然說關鍵方法只有一個用於檢索下一事件的方法next(),但是還存在一些方法也可以檢索下一事件,用於不同的情況下使用,如:nextText():用於檢索下一元素的文本;nextTag():用於檢索下一元素的標簽。
XMLPULL的簡單步驟
對於XmlPullParserFactory類,沒有提供公開的構造方法(單例模式),必須使用它的靜態方法newInstance()來獲得對象實例。獲得XmlPullParser必須使用XmlPullParserFactory.newPullParser()獲得。
示例
現在通過一個示例程序來講解一下XMLPULL的使用。
這是一個Android應用程序,需要增加訪問網絡的權限,解析IIS服務器上的一個靜態的.XML文件。布局界面也比較簡單,就是一個按鈕,這裡不展示代碼了,具體的可以下載代碼查看。
待解析的XML文件內容:
- <?xml version="1.0" encoding="utf-8"?>
- <persons>
- <person id="23">
- <name >Jack</name>
- <age>21</age>
- </person>
- <person id="20">
- <name>Dick</name>
- <age>23</age>
- </person>
- </persons>
IIS服務器上的XML文件,使用的HTTPURLConnection的方式獲得,具體參見另外一篇:http://www.fengfly.com/plus/view-213371-1.html。這裡就再重復給出。
新建一個Person類,用於存放通過XML解析之後的數據,只有三個字段id、name、age並提供對於的get()set()方法,還有toString()方法,這裡不展示代碼了。
以下是PullXML的解析類:
- package cn.bgxt.parser;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import org.xmlpull.v1.XmlPullParserFactory;
- import cn.pull.domain.Person;
- public class PullXMLTools {
- public PullXMLTools() {
- // TODO Auto-generated constructor stub
- }
- /**
- * 把服務器傳遞過的XML流數據解析成對象
- * @param inputStream XML流
- * @param encode 編碼格式
- * @return
- */
- public static List<Person> parserXML(InputStream inputStream, String encode)
- throws XmlPullParserException, IOException {
- List<Person> list = null;
- Person person = null;
- //獲得一個XMLPULL工廠類的實例
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- //獲得一個XML解析器的實例
- XmlPullParser parser = factory.newPullParser();
- //設置解析器的輸入,使用inputStream流式數據。
- parser.setInput(inputStream, encode);
- //判斷當前的事件類型
- int eventType = parser.getEventType();
- //循環讀取,知道事件類型為文檔結束
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- // 通過判斷事件類型來選擇執行不同的代碼
- case XmlPullParser.START_DOCUMENT:
- //文檔開始的時候,實例化list對象,用於存放XML解析後的數據
- list=new ArrayList<Person>();
- break;
- case XmlPullParser.START_TAG:
- //讀取標簽的時候觸發這個事件
- if(parser.getName().equals("person"))
- {
- //如果當前讀取到的節點是person節點,那麼實例化一個person對象。
- person=new Person();
- //獲得person節點中的屬性ID
- int id=Integer.parseInt(parser.getAttributeValue(0));
- person.setId(id);
- }
- else if(parser.getName().equals("name"))
- {
- if(person!=null)
- {
- //獲得name節點的下一個element Text
- String name=parser.nextText();
- person.setName(name);
- }
- }
- else if(parser.getName().equals("age"))
- {
- if(person!=null)
- {
- //獲得age節點的下一個element Text
- int age=Integer.parseInt(parser.nextText());
- person.setAge(age);
- }
- }
- break;
- case XmlPullParser.END_TAG:
- if(parser.getName().equals("person"))
- {
- //讀到結束節點標簽,如果為person,則把之前讀取到的person對象加入list中,
- //並且制空person對象。
- list.add(person);
- person=null;
- }
- break;
- }
- //讀取
- eventType=parser.next();
- }
- return list;
- }
- }
Activity中的代碼,需要實現一個按鈕的點擊事件,因為是在Android4.0+的環境下,需要使用多線程訪問網絡。
- package cn.bgxt.xmlforpull;
- import java.io.InputStream;
- import java.util.List;
- import cn.bgxt.Http.HttpUtils;
- import cn.bgxt.parser.PullXMLTools;
- import cn.pull.domain.Person;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.Menu;
- import android.view.View;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private Button btn;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btn=(Button)findViewById(R.id.btn);
- btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Thread thread=new Thread(new Runnable() {
- @Override
- public void run() {
- String path="http://192.168.1.107:1231/persons.xml";
- InputStream inputStream=HttpUtils.getXML(path);
- List<Person> list=null;
- try {
- list = PullXMLTools.parserXML(inputStream, "utf-8");
- for(Person person:list)
- {
- System.out.println(person.toString());
- }
- } catch (Exception e) {
- // TODO: handle exception
- }
- }
- });
- thread.start();
- }
- });
- }
- }
在設備上運行程序,如果讀取成功,可以在LogCat中查看到輸出內容。
提供一下示例程序的源碼,有需要的朋友可以下載觀看。
總結
現在已經說了兩種在Android平台下解析XML的方式,分別是SAX和PULL,這兩種方式都適用於Android平台,因為都是以流的形式訪問數據,消耗的硬件資源小,速度快,但是也存在不同的適用環境。如果清楚的知道XML文檔的結構,每一級節點的名稱,那麼使用PULL方式可以簡化開發,但是如果不確定XML文檔的結構,那還是使用SAX的方式比較妥當,無需關心各節點的名稱。
做了個Android項目,需要接入新浪微博,實現時也順帶著研究了下騰訊微博和人
如圖所示為程序效果動畫圖 地圖滾動的原理 在本人之前博客的文章中介紹過人物在屏幕中的移動方式,因為之前拼的游戲地圖是完全填充整個手機屏幕的,所以無需處理地圖的平
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放