激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 在Android系統中解析XML文件的方法

在Android系統中解析XML文件的方法

2019-12-31 14:26低調小一 JAVA教程

這篇文章主要介紹了在Android系統中解析XML文件的方法,利用Java寫成的XmlPullParser解析器,需要的朋友可以參考下

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

XML
    XML(eXtensible Markup Language)中文名為可擴展標記語言。標記指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種信息的文章等。
用途
    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示例文件代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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解析器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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類的定義比較簡單,代碼如下:

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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;
   }
  
 }

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄污视频在线看 | 欧美一级视频网站 | 蜜桃精品视频在线观看 | 欧美亚洲国产日韩 | 日韩精品中文字幕在线观看 | 欧美日本91精品久久久久 | 久久精精品 | 午夜a狂野欧美一区二区 | 欧美激情精品久久久久久久久久 | 一级一级一级一级毛片 | 国产在线欧美日韩 | free台湾极品性hd | 在线日韩| 免费毛片视频 | 国产91在线高潮白浆在线观看 | 综合精品久久 | 羞羞色在线观看 | 视频久久免费 | 91精品视频网址 | 91精品国产一区二区三区动漫 | 国产精品刺激对白麻豆99 | 奇米影视在线 | 国产精品久久久久久久久久iiiii | av国语| 久久久久亚洲视频 | 成人午夜网址 | 蜜桃91麻豆| 日本精品视频一区二区三区四区 | 成人免费一区二区三区在线观看 | 日本中文高清 | 久久金品 | 深夜免费视频 | 免费看成人毛片 | 国产精品久久久久久久av | 免费人成在线播放 | 一级片国语 | 俄罗斯16一20sex牲色另类 | 亚洲码无人客一区二区三区 | 国产精品久久久久久久久久久久久久久 | 日日鲁一鲁视频 | 亚洲精品久久久久久下一站 |