android xml解析之Pull

來源:互聯網
上載者:User

除了可以使用 SAX和DOM解析XML檔案,大家也可以使用Android內建的Pull解析器解析XML檔案。 Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素並觸發相應事件。事件將作為數值代碼被發送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以擷取下一個Text類型節點的值。

使用Pull解析器讀取itcast.xml的代碼在本頁下方備忘

 Pull解析器的源碼及文檔下載網址:http://www.xmlpull.org/

 下面是本例子要解析的XML檔案:

檔案名稱:itcast.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
 <person id="23">
  <name>liming</name>
  <age>30</age>
 </person>
 <person id="20">
  <name>lixiangmei</name>
  <age>25</age>
 </person>
</persons>

例子定義了一個javabean用於存放上面解析出來的xml內容, 這個javabean為Person。javaBean在MVC設計模型中是model,又稱模型層,在一般的程式中,我們稱它為資料層,就是用來設定資料的屬性和一些行為,然後我會提供擷取屬性和設定屬性的get/set方法

下面來看具體的執行個體:

首先建一個itcast.xml檔案在src目錄下,然後建立一個cn.itcast.domain包,在包下建立一個person類,主要用於存放上面解析出來的xml內容,javaBean在MVC設計模型中是model,又稱模型層,在一般的程式中,我們稱它為資料層,就是用來設定資料的屬性和一些行為,然後我會提供擷取屬性和設定屬性的get/set方法

具體代碼如下:

View Code

 1 package cn.itcast.domain;
2
3 public class Person {
4 private Integer id;
5 private String name;
6 private Short age;
7
8 public Person(){}
9
10 public Person(Integer id, String name, Short age) {
11 this.id = id;
12 this.name = name;
13 this.age = age;
14 }
15
16 public Integer getId() {
17 return id;
18 }
19 public void setId(Integer id) {
20 this.id = id;
21 }
22 public String getName() {
23 return name;
24 }
25 public void setName(String name) {
26 this.name = name;
27 }
28 public Short getAge() {
29 return age;
30 }
31 public void setAge(Short age) {
32 this.age = age;
33 }
34 @Override
35 public String toString() {
36 return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
37 }
38
39 }

 

第二步:建立一個package cn.itcast.service包,在包下建立一個PULLPersonService類,這個就是MVC裡的M,業務類,主要代碼如下

 

View Code

 1 package cn.itcast.service;
2
3 import java.io.InputStream;
4 import java.util.ArrayList;
5 import java.util.List;
6 import javax.xml.parsers.SAXParser;
7 import javax.xml.parsers.SAXParserFactory;
8 import org.xml.sax.Attributes;
9 import org.xml.sax.SAXException;
10 import org.xml.sax.helpers.DefaultHandler;
11
12 import cn.itcast.domain.Person;
13 /**
14 * 採用SAX解析XML內容
15 */
16 public class SAXPersonService {
17 private final class PersonParser extends DefaultHandler{
18 //把解析到的資料都放到集合裡面去
19 private List<Person> persons = null;
20 //記錄當前所解析到的元素節點名稱
21 private String tag = null;
22 private Person person = null;
23 //提供一個getpersons方法,主要是為主程式使用
24 public List<Person> getPersons() {
25 return persons;
26 }
27
28 @Override
29 public void startDocument() throws SAXException {
30 //初始化
31 persons = new ArrayList<Person>();
32 }
33
34 @Override
35 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
36 //判斷是不是我們要解析的元素節點
37 if("person".equals(localName)){
38 person = new Person();//new出person對象,把要解析的內容傳給person的Id屬性
39 person.setId(new Integer(attributes.getValue(0)));
40 }
41 //存放節點名稱到成員變數裡面
42 tag = localName;
43 }
44
45 @Override
46 public void characters(char[] ch, int start, int length)
47 throws SAXException {
48 //首先判斷節點名稱是否為空白,然後在判斷節點名稱是否為name
49 if(tag!=null){
50 String data = new String(ch, start, length);//擷取文本節點的資料
51 if("name".equals(tag)){//判斷節點名稱是否為name
52 person.setName(data);//把要解析的內容傳給person的name屬性
53 }else if("age".equals(tag)){//判斷節點名稱是否為age
54 person.setAge(new Short(data));
55 }
56 }
57 }
58
59 @Override
60 public void endElement(String uri, String localName, String qName)
61 throws SAXException {
62 if("person".equals(localName)){//當跟末節點為person時
63 persons.add(person);//把person放到集合persons裡面
64 person = null;//把當前person設為空白
65 }
66 //遇到結束元素就把記錄設為空白
67 tag = null;
68 }
69 }
70 }


第三步:在主包下建立一個PersonServiceTest類,這個類相當與mvc中的c(控制層),主要是對PULLPersonService這個類PullGetPersons()方法進行單元測試

 

View Code

 1 public class PersonServiceTest extends AndroidTestCase {
2 private static final String TAG = "PersonServiceTest";
3 public void testPullGetPersons() throws Throwable{
4 InputStream inStream = getClass().getClassLoader().getResourceAsStream("itcast.xml");
5 List<Person> persons = PULLPersonService.getPersons(inStream);
6 for(Person person : persons){
7 Log.i(TAG, person.toString());
8 }
9 }
10 }


第三步:對textPullGetPersons()方法進行單元測試,輸入結果為

 

 

 

 

 

 

聯繫我們

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