在Android系統中解析XML檔案的方法_java

來源:互聯網
上載者:User

前言
    在學習Android的Framework層源碼時,Android大量的使用XmlPullParser來解析xml檔案的源碼。因此,這裡也順道介紹一下XmlPullParser的使用。

XML
    XML(eXtensible Markup Language)中文名為可延伸標記語言 (XML)。標記指電腦所能理解的資訊符號,通過此種標記,電腦之間可以處理包含各種資訊的文章等。
用途
    XML設計用了傳送及攜帶資料資訊,不用了表現或展示資料,HTML語言則用了表現資料,所以XML用途的焦點是它說明資料是什麼,以及攜帶資料資訊。

  •     豐富檔案——自定檔案描述並使其更豐富
  •     中繼資料——描述其它檔案或網路資訊
  •     配置文檔——描述軟體佈建的參數

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

XmlPullParser
    PULL解析xml是基於事件驅動的方式解析XML檔案,pull開始解析時,我們可以先通過getEventType()方法擷取當前解析事件類型,並且通過next()方法擷取下一個解析事件類型。PULL解析器提供了START_DOCUMENT(開始文檔)、END_DOCUMENT(結束文檔)、START_TAG(開始標籤)、END_TAG(結束標籤)四種事件解析類型。當處於某個元素時,可以調用getAttributeValue()方法擷取屬性的值,也可以通過nextText()方法擷取本節點的文本值。下面通過一個例子來進行解析。
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();            // 設定檔案輸入資料流         parser.setInput(xmlReader);            // 得到當前事件類型         int eventType = parser.getEventType();            Colleague colleague = null;            while (eventType != XmlPullParser.END_DOCUMENT) {           switch (eventType) {           case XmlPullParser.START_DOCUMENT:             break;           case XmlPullParser.START_TAG:             /**              * 通過getName判斷讀到哪個標籤, 然後通過nextText擷取文本節點值,              * 或者通過getAttributeValue(i)擷取屬性節點值              */             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;     }      } 

相關文章

聯繫我們

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