Android App中使用Pull解析XML格式資料的使用樣本_Android

來源:互聯網
上載者:User

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

列印出的對象:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.