Android平台基於Pull方式對XML檔案解析與寫入方法詳解_Android

來源:互聯網
上載者:User

本文詳細講述了Android平台基於Pull方式對XML檔案解析與寫入方法。分享給大家供大家參考,具體如下:

XML技術在跨平台的情況下的資料互動中得到了廣泛的應用,假如我們需要開發一個Android應用程式,需要同伺服器端進行資料互動,通過XML檔案可以很方便的在Android平台和伺服器之間進行資料轉送,具體實現涉及到對XML檔案進行解析及寫入的技術。本文實現在Android平台上基於Pull方式對XML檔案解析的技術。

XmlPullParser是一個Java實現的開源API包(源碼下載地址http://www.xmlpull.org/),實現了pull方式解析xml檔案的方法, Android SDK中包含了該API,使用時需要匯入以下三個包:

import org.xmlpull.v1.XmlPullParser;//包含解析XML檔案類的包import org.xmlpull.v1.XmlPullParserException;//處理異常importorg.xmlpull.v1.XmlSerializer;//包含寫入XML檔案類的包

我們以SQLite資料庫課堂練習中的資料類People為例,People類有4個屬性:ID,Name,Age,Height,假設有一條測試資料ID=1,Name=”杜甫”,Age=30,Height=1.75,

在XML檔案中對應的資料項目元素如下:

<peopleinfo>  <peopletag="item1">    <id>1</id>    <name>杜甫</name>    <age>30</age>    <height>1.75</height></people></peopleinfo>

1. 使用XmlPullParser對該檔案解析

首先需要初始化一個XmlPullParser對象parser,R.xml.peopleinfo為檔案peopleinfo.xml在項目中的標識,讀入該檔案後一步一步對檔案中的元素進行解析。

XmlPullParser parser= getResources().getXml(R.xml.peopleinfo);

XmlPullParser的相關函數及說明如下:

相關函數或變數

說明

樣本

XmlPullParser.START_DOCUMENT

文檔開始標識,根項目

<peopleinfo>

XmlPullParser.END_DOCUMENT

文檔結束標識

</peopleinfo>

XmlPullParser.START_TAG

元素開始標識

<people>

XmlPullParser.END_TAG

元素結束標識

</people>

getEventType()

擷取當元素的類型 (如START_TAG, END_TAG, TEXT, etc.)

如<peopleinfo>

的類型為START_DOCUMENT

next()

擷取下一個待解析元素

事件表示<>括弧中的一個項

getName()

擷取當前元素的名字

如讀取到<age>,傳回值為”age”

nextText()

返回當前元素所對應的文本值

如事件為<height>時,返回1.75

getAttributeName(int index)

擷取當前元素中屬性名稱

如tag

getAttributeValue(int index)

擷取當前元素中屬性的值

"item1"


解析步驟:

1)    初始化parser,指定xml檔案
2)    讀取文檔開始標識,根項目<peopleinfo>
3)    讀取資料項目元素開始標識, <people>
    a)    讀取資料項目元素的屬性,tag="item1"
    b)    讀取資料項目的子項目,id,name,age,height
4)    一個資料項目結束,</people>,儲存該資料項目的結果
5)    讀取文檔結束標識,</peopleinfo>

2. 使用XmlSerializer對寫XML檔案

寫入XML檔案的過程:先初始化一個XmlSerializer對象serializer,設定輸出的Writer對象,然後資料寫入serializer中,再將該對象通過Writer寫入檔案。

XmlSerializer serializer = Xml.newSerializer();serializer.setOutput(writer);//…writer.flush()

XmlSerializer的相關函數及說明如下:

相關函數

說明

樣本

setOutput(Writer writer)

設定輸出的Writer對象

 

startDocument(String encoding, Boolean standalone);

寫入XML檔案的起始標識語句,必須在setOutput後被調用

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

startTag(String namespace, String name);

寫入開始元素標識

如<people>,<age>

attribute(String namespace, String name, String value); 

 

如tag=”people1”

text(String text)

寫入元素值

如:杜甫

endTag(String namespace, String name)

寫入元素結束標識

如</people>,</age>

endDocument(); 

寫入文檔結束標記

 


寫入步驟:

1) 初始化serializer
2) 設定Writer對象writer
3) 寫入文檔開始標記<?xml version="1.0" encoding="UTF-8"standalone="yes" ?>
4) 寫入根項目<peopleinfo>
5) 寫入資料項目元素<people>
    a)  寫入資料項目屬性tag=”people1”
    b)  寫入資料項目子項目,id,name,age,height
6) 寫入資料項目元素結束符</people>
7) 寫入根項目結束符</peopleinfo>
8) 寫入文檔結束符
9) 通過writer將資料寫入檔案,writer.flush()
10) 關閉writer對象

實現工具類XmlPullHelper,提供對XML檔案解析和寫入的

1. 具體實現,代碼如下:

package aaron.android.SQLiteDamon;import java.io.IOException;import java.io.Writer;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlSerializer;import android.util.Log;public class XmlPullHelper {  private XmlPullParser parser;  private XmlSerializer serializer;  private ArrayList<Map<String, Object>> contents=new ArrayList<Map<String,Object>>();  private Map<String,Object> map=null;  public XmlPullHelper(XmlPullParser parser,XmlSerializer serial){    this.parser=parser;    this.serializer = serial;  }  /**   * 將xml檔案中的所有節點的資料解析後儲存在一個ArrayList中返回   * @param nodeName:資料項目的名稱,這裡為"people"   * @param attr:資料項目的屬性,如id,name,age,height   * @return 解析該xml檔案資料的結果   * @throws XmlPullParserException   * @throws IOException   */  public ArrayList<Map<String,Object>> xmlPull(String nodeName,String[] attr) throws XmlPullParserException, IOException{    //迴圈讀取所有的元素    while(parser.next()!=XmlPullParser.END_DOCUMENT){      switch(parser.getEventType()){        case XmlPullParser.START_DOCUMENT:          break;        case XmlPullParser.START_TAG:{  //元素開始標識          //判斷是否為所需要的資料項目,如果是,在初始化一個map用於儲存該資料項目的值          if(parser.getName()!=null&&parser.getName().equals(nodeName)){            map=new HashMap<String, Object>();            //迴圈讀取該元素中所有的屬性            for(int j=0;j<parser.getAttributeCount();j++)              map.put(parser.getAttributeName(j), parser.getAttributeValue(j));//添加屬性的值,如tag="item1"          }          else if(map!=null){            for(int i=0;i<attr.length;i++){              if(parser.getName()!=null&&parser.getName().equals(attr[i])){//添加子項目的值,如<name>張三</name>                map.put(attr[i],parser.nextText());              }            }          }          break;        }        case XmlPullParser.END_TAG: {//元素結尾標識          //判斷是否為一個資料項目的結束,如果是,將該資料項目的資料添加到資料集contents中          if(parser.getName().equals(nodeName)&&map!=null){            contents.add(map);            map=null;          }          break;        }      }    }    return contents;  }  /**   * 將給定的資料集寫入XML檔案   * @param fileName: 根項目名,預設設為跟檔案名稱相同,如"peopleinfo"   * @param nodeName: 資料項目名 如"people"   * @param attr: 資料項目的屬性 如id,name,age,height   * @param con: 待寫入的資料集   * @throws XmlPullParserException   * @throws IOException   */  public void xmlWrite(String fileName,String nodeName,String[] attr,ArrayList<Map<String,Object>> con) throws XmlPullParserException, IOException{    serializer.startDocument("UTF-8", true);    serializer.startTag(null, fileName);//開始根項目標籤<peopleinfo>    for(int i=0;i<con.size();i++)    {      //開始元素標籤<people>      serializer.startTag(null, nodeName);      //標籤people屬性      serializer.attribute(null, "tag", "people"+i);      //迴圈將子節點寫入元素id,name,age,height      for(int j=0;j<attr.length;j++)      {        serializer.startTag(null, attr[j]);        serializer.text(con.get(i).get(attr[j]).toString());        serializer.endTag(null, attr[j]);      }      //結束標籤</people>      serializer.endTag(null, nodeName);    }    //結束標籤</peopleinfo>    serializer.endTag(null, fileName);    //結束文檔標記    serializer.endDocument();  }}

1. 使用該工具類XmlPullHelper具體實現

//定義資料集對象contents用於儲存從XML檔案中讀取的資料ArrayList<Map<String, Object>> contents = null;//將資料寫入XML檔案,並儲存到SD卡中if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){    File sdCardDir = Environment.getExternalStorageDirectory();//擷取SDCard目錄    File saveFile = new File(sdCardDir, "peopleinfo.xml");    FileWriter w=new FileWriter(saveFile);    XmlSerializer serializer = Xml.newSerializer();    XmlPullHelper xHelper=new XmlPullHelper(null,serializer);    //待寫入的子項目標籤    String []items={"id","name","age","height"};    //將Writer對象傳遞給 serializer    serializer.setOutput(w);    xHelper.xmlWrite("peopleinfo", "people", items, contents);//調用寫入方法    w.flush(); //將serializer中資料寫入檔案    w.close();}//讀XML檔案,解析並儲存在資料集contentsXmlPullParser parser = getResources().getXml(R.xml.peopleinfo);XmlPullHelper xHelper=new XmlPullHelper(parser,null);String []items={"id","name","age","height"};try{  contents=xHelper.xmlPull("people", items);//調用解析方法}catch(Exception e){  Log.e("XmlPullParser",e.getMessage(),e);}

Android SDK內建了Pull解譯器,使用XmlPullParser比較方便,解析XML檔案的技術還有很多種,如 SAX和DOM,還需要更多的學習。

更多關於Android相關內容感興趣的讀者可查看本站專題:《Android操作XML資料技巧總結》、《Android編程之activity操作技巧總結》、《Android資源操作技巧匯總》、《Android檔案操作技巧匯總》、《Android操作SQLite資料庫技巧總結》、《Android操作json格式資料技巧總結》、《Android資料庫操作技巧總結》、《Android編程開發之SD卡操作方法匯總》、《Android開發入門與進階教程》、《Android視圖View技巧總結》及《Android控制項用法總結》

希望本文所述對大家Android程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.