欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程解析XML文件的方法詳解【基于XmlPullParser】

 更新時間:2017年07月31日 11:23:57   作者:低調(diào)小一  
這篇文章主要介紹了Android編程解析XML文件的方法,結(jié)合實例形式分析了Android基于XmlPullParser解析xml文件的相關(guān)操作技巧與注意事項,需要的朋友可以參考下

本文實例講述了Android編程解析XML文件的方法。分享給大家供大家參考,具體如下:

前言

在學(xué)習(xí)Android的Framework層源碼時,Android大量的使用XmlPullParser來解析xml文件的源碼。因此,這里也順道介紹一下XmlPullParser的使用。

XML

XML(eXtensible Markup Language)中文名為可擴展標(biāo)記語言。標(biāo)記指計算機所能理解的信息符號,通過此種標(biāo)記,計算機之間可以處理包含各種信息的文章等。

用途

XML設(shè)計用了傳送及攜帶數(shù)據(jù)信息,不用了表現(xiàn)或展示數(shù)據(jù),HTML語言則用了表現(xiàn)數(shù)據(jù),所以XML用途的焦點是它說明數(shù)據(jù)是什么,以及攜帶數(shù)據(jù)信息。

豐富文件——自定文件描述并使其更豐富
元數(shù)據(jù)——描述其它文件或網(wǎng)絡(luò)資訊
配置文檔——描述軟件設(shè)置的參數(shù)

結(jié)構(gòu)

每個XML文檔都由XML序言開始,在前面的代碼中第一行就是XML序言,<?xml version="1.0"?>。這一行代碼會告訴解析器或瀏覽器這個文件應(yīng)該按照XML規(guī)則進行解析。但是,根元素的名稱是由文檔類型定義或XML綱要定義的。

XmlPullParser

PULL解析xml是基于事件驅(qū)動的方式解析XML文件,pull開始解析時,我們可以先通過getEventType()方法獲取當(dāng)前解析事件類型,并且通過next()方法獲取下一個解析事件類型。PULL解析器提供了START_DOCUMENT(開始文檔)、END_DOCUMENT(結(jié)束文檔)、START_TAG(開始標(biāo)簽)、END_TAG(結(jié)束標(biāo)簽)四種事件解析類型。當(dāng)處于某個元素時,可以調(diào)用getAttributeValue()方法獲取屬性的值,也可以通過nextText()方法獲取本節(jié)點的文本值。下面通過一個例子來進行解析。

xml示例文件

需要解析的xml示例文件代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<colleagues>
  <colleague id="1">
    <name>耗子</name>
    <age>24</age>
    <sex>boy</sex>
  </colleague>
  <colleague id="2">
    <name>璐璐</name>
    <age>28</age>
    <sex>girl</sex>
  </colleague>
  <colleague id="3">
    <name>陳善</name>
    <age>26</age>
    <sex>boy</sex>
  </colleague>
</colleagues>

XmlPullParser解析器

package com.example.shakedemo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.R.xml;
import android.util.Log;
import android.util.Xml;
public class XmlPullParserHelper {
  public static List<Colleague> getColleagues(String xmlFilePath) {
    List<Colleague> colleagues = new ArrayList<Colleague>();
    FileReader xmlReader = null;
    try {
      xmlReader = new FileReader(new File(xmlFilePath));
    } catch (FileNotFoundException e) {
      Log.e("wzy", "Couldn't find xml file " + xmlFilePath);
      return colleagues;
    }
    try {
      // 方式1: 使用 Android 提供的android.util.Xml 類獲取 parser 對象
      XmlPullParser parser = Xml.newPullParser();
      // 方式2: 使用工廠類 XmlPullParserFactory
      // XmlPullParserFactory pullFactory =
      // XmlPullParserFactory.newInstance();
      // XmlPullParser parser = pullFactory.newPullParser();
      // 設(shè)置文件輸入流
      parser.setInput(xmlReader);
      // 得到當(dāng)前事件類型
      int eventType = parser.getEventType();
      Colleague colleague = null;
      while (eventType != XmlPullParser.END_DOCUMENT) {
        switch (eventType) {
        case XmlPullParser.START_DOCUMENT:
          break;
        case XmlPullParser.START_TAG:
          /**
           * 通過getName判斷讀到哪個標(biāo)簽, 然后通過nextText獲取文本節(jié)點值,
           * 或者通過getAttributeValue(i)獲取屬性節(jié)點值
           */
          String name = parser.getName();
          if ("colleague".equals(name)) {
            colleague = new Colleague();
            colleague.setId(Integer.parseInt(parser.getAttributeValue(null, "id")));
          } else if ("name".equals(name)) {
            if (colleague != null) {
              colleague.setName(parser.nextText());
            }
          } else if ("age".equals(name)) {
            if (colleague != null) {
              colleague.setAge(Integer.parseInt(parser.nextText()));
            }
          } else if ("sex".equals(name)) {
            if (colleague != null) {
              colleague.setSex(parser.nextText());
            }
          }
          break;
        case XmlPullParser.END_TAG:
          if ("colleague".equals(parser.getName()) && colleague != null) {
            colleagues.add(colleague);
            colleague = null;
          }
          break;
        }
        eventType = parser.next();
      }
      xmlReader.close();
    } catch (XmlPullParserException e) {
      // Do nothing
    } catch (IOException e) {
      // Do nothing
    }
    return colleagues;
  }
}

其中,colleague類的定義比較簡單,代碼如下:

package com.example.shakedemo;
public class Colleague {
  private int id;
  private int age;
  private String name;
  private String sex;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  @Override
  public String toString() {
    return "ID is " + id + ", Name is " + name + ", Sex is " + sex;
  }
}

PS:這里再為大家提供幾款關(guān)于xml操作的在線工具供大家參考使用:

在線XML/JSON互相轉(zhuǎn)換工具:
http://tools.jb51.net/code/xmljson

在線格式化XML/在線壓縮XML
http://tools.jb51.net/code/xmlformat

XML在線壓縮/格式化工具:
http://tools.jb51.net/code/xml_format_compress

XML代碼在線格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android操作XML數(shù)據(jù)技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android開發(fā)入門與進階教程》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • Android屏幕旋轉(zhuǎn) 處理Activity與AsyncTask的最佳解決方案

    Android屏幕旋轉(zhuǎn) 處理Activity與AsyncTask的最佳解決方案

    運行時變更就是設(shè)備在運行時發(fā)生變化(例如屏幕旋轉(zhuǎn)、鍵盤可用性及語言)。發(fā)生這些變化,Android會重啟Activity,這時就需要保存activity的狀態(tài)及與activity相關(guān)的任務(wù),以便恢復(fù)activity的狀態(tài)。為此,google提供了三種解決方案,本文將對這三種方案進行逐一介紹。
    2016-12-12
  • Java語言讀取配置文件config.properties的方法講解

    Java語言讀取配置文件config.properties的方法講解

    今天小編就為大家分享一篇關(guān)于Java語言讀取配置文件config.properties的方法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Android判斷登錄情況

    Android判斷登錄情況

    這篇文章主要介紹了Android判斷登錄情況,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Android webview用法實例簡析

    Android webview用法實例簡析

    這篇文章主要介紹了Android webview用法,結(jié)合實例形式簡單分析了Android中webview的功能、用法與相關(guān)注意事項,需要的朋友可以參考下
    2016-01-01
  • Flutter軟鍵盤的原理淺析

    Flutter軟鍵盤的原理淺析

    大家應(yīng)該都知道目前Flutter官方是沒有自定義鍵盤的解決方案,下面這篇文章主要給大家介紹了關(guān)于Flutter軟鍵盤原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • Android集成百度地圖開發(fā)流程和注意事項

    Android集成百度地圖開發(fā)流程和注意事項

    現(xiàn)在很多項目都需要集成百度地圖,所以就把自己做過一個項目的經(jīng)驗寫出來和大家分享,方便自己和大家使用的時候參考借鑒,下面就來一起看看Android集成百度地圖開發(fā)流程和注意事項吧。
    2016-09-09
  • Android無需讀寫權(quán)限通過臨時授權(quán)讀寫用戶文件詳解

    Android無需讀寫權(quán)限通過臨時授權(quán)讀寫用戶文件詳解

    這篇文章主要為大家介紹了Android無需讀寫權(quán)限通過臨時授權(quán)讀寫用戶文件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Android TextWatcher監(jiān)控EditText中的輸入內(nèi)容并限制其個數(shù)

    Android TextWatcher監(jiān)控EditText中的輸入內(nèi)容并限制其個數(shù)

    本篇文章主要介紹了Android TextWatcher監(jiān)控EditText中的輸入內(nèi)容并限制其個數(shù),我們可以通過TextWatcher去觀察輸入框中輸入的內(nèi)容,有興趣的可以了解一下。
    2017-04-04
  • Android自定義scrollView實現(xiàn)頂部圖片下拉放大

    Android自定義scrollView實現(xiàn)頂部圖片下拉放大

    這篇文章主要為大家詳細(xì)介紹了Android自定義scrollView實現(xiàn)頂部圖片下拉放大,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • android圖像繪制(五)畫布保存為指定格式/大小的圖片

    android圖像繪制(五)畫布保存為指定格式/大小的圖片

    將圖片進行編輯(放縮,涂鴉等),最后保存成指定格式、大小的圖片,接下來將介紹保存方法,感興趣的朋友可以了解下啊
    2013-01-01

最新評論