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

在Android系統(tǒng)中解析XML文件的方法

 更新時(shí)間:2015年07月31日 10:33:16   作者:低調(diào)小一  
這篇文章主要介紹了在Android系統(tǒng)中解析XML文件的方法,利用Java寫成的XmlPullParser解析器,需要的朋友可以參考下

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

XML
    XML(eXtensible Markup Language)中文名為可擴(kuò)展標(biāo)記語言。標(biāo)記指計(jì)算機(jī)所能理解的信息符號(hào),通過此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種信息的文章等。
用途
    XML設(shè)計(jì)用了傳送及攜帶數(shù)據(jù)信息,不用了表現(xiàn)或展示數(shù)據(jù),HTML語言則用了表現(xiàn)數(shù)據(jù),所以XML用途的焦點(diǎn)是它說明數(shù)據(jù)是什么,以及攜帶數(shù)據(jù)信息。

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

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

XmlPullParser
    PULL解析xml是基于事件驅(qū)動(dòng)的方式解析XML文件,pull開始解析時(shí),我們可以先通過getEventType()方法獲取當(dāng)前解析事件類型,并且通過next()方法獲取下一個(gè)解析事件類型。PULL解析器提供了START_DOCUMENT(開始文檔)、END_DOCUMENT(結(jié)束文檔)、START_TAG(開始標(biāo)簽)、END_TAG(結(jié)束標(biāo)簽)四種事件解析類型。當(dāng)處于某個(gè)元素時(shí),可以調(diào)用getAttributeValue()方法獲取屬性的值,也可以通過nextText()方法獲取本節(jié)點(diǎn)的文本值。下面通過一個(gè)例子來進(jìn)行解析。
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 對(duì)象 
        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判斷讀到哪個(gè)標(biāo)簽, 然后通過nextText獲取文本節(jié)點(diǎn)值, 
             * 或者通過getAttributeValue(i)獲取屬性節(jié)點(diǎn)值 
             */ 
            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類的定義比較簡(jiǎn)單,代碼如下:

  

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

相關(guān)文章

  • Java詳細(xì)分析講解自動(dòng)裝箱自動(dòng)拆箱與Integer緩存的使用

    Java詳細(xì)分析講解自動(dòng)裝箱自動(dòng)拆箱與Integer緩存的使用

    裝箱就是把基本類型轉(zhuǎn)換成包裝類,拆箱就是把包裝類轉(zhuǎn)換成基本類型,下面這篇文章主要給大家介紹Java中自動(dòng)裝箱、自動(dòng)拆箱與Integer緩存,需要的朋友可以參考下
    2022-04-04
  • 區(qū)塊鏈常用數(shù)據(jù)庫(kù)leveldb用java來實(shí)現(xiàn)常規(guī)操作的方法

    區(qū)塊鏈常用數(shù)據(jù)庫(kù)leveldb用java來實(shí)現(xiàn)常規(guī)操作的方法

    這篇文章主要介紹了區(qū)塊鏈常用數(shù)據(jù)庫(kù)leveldb用java來實(shí)現(xiàn)常規(guī)操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java自動(dòng)讀取指定文件夾下所有文件的方法

    Java自動(dòng)讀取指定文件夾下所有文件的方法

    這篇文章主要為大家詳細(xì)介紹了Java自動(dòng)讀取指定文件夾下所有文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類失效原因分析

    SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處

    這篇文章主要介紹了SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類失效原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot集成xxl-job實(shí)現(xiàn)超牛的定時(shí)任務(wù)的步驟詳解

    SpringBoot集成xxl-job實(shí)現(xiàn)超牛的定時(shí)任務(wù)的步驟詳解

    XXL-JOB是一個(gè)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡(jiǎn)單、輕量級(jí)、易擴(kuò)展,現(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用,本文給大家介紹了SpringBoot集成xxl-job實(shí)現(xiàn)超牛的定時(shí)任務(wù),需要的朋友可以參考下
    2023-10-10
  • Java中反射詳解

    Java中反射詳解

    本文主要介紹了Java中反射的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • kafka消費(fèi)者kafka-console-consumer接收不到數(shù)據(jù)的解決

    kafka消費(fèi)者kafka-console-consumer接收不到數(shù)據(jù)的解決

    這篇文章主要介紹了kafka消費(fèi)者kafka-console-consumer接收不到數(shù)據(jù)的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 老生常談Java String字符串(必看篇)

    老生常談Java String字符串(必看篇)

    下面小編就為大家?guī)硪黄仙U凧ava String字符串(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 一文帶你剖析Redisson分布式鎖的原理

    一文帶你剖析Redisson分布式鎖的原理

    相信使用過redis的,或者正在做分布式開發(fā)的童鞋都知道redisson組件,它的功能很多,但我們使用最頻繁的應(yīng)該還是它的分布式鎖功能,少量的代碼,卻實(shí)現(xiàn)了加鎖、鎖續(xù)命(看門狗)、鎖訂閱、解鎖、鎖等待(自旋)等功能,我們來看看都是如何實(shí)現(xiàn)的
    2022-11-11
  • Springboot接收?Form?表單數(shù)據(jù)的示例詳解

    Springboot接收?Form?表單數(shù)據(jù)的示例詳解

    這篇文章主要介紹了Springboot接收?Form?表單數(shù)據(jù)的實(shí)例代碼,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08

最新評(píng)論