Android學習之使用SAX解析xml檔案

來源:互聯網
上載者:User

Android上經常使用xml來傳遞和交換資料。SAX(Simple API for XML)作為一種解析速度快並且佔用記憶體少的xml解析器,非常適合Android等行動裝置。SAX解析採用事件驅動,會判斷當前讀取到的字元是否符合xml文法中的某部分,從而觸發相應事件。xml中的節點分為2種類型,分別是Element Node(元素節點)和Text Node(文本節點)。對於元素節點,當讀取到開始標籤時會觸發startElement事件,當讀取到結束標籤時會觸發endElement事件。對於文本節點,當讀取到文本時會觸發characters事件。另外,xml文檔開始和結束時會分別觸發startDocument和endDocument事件。所謂事件其實就是一些回調方法,這些方法定義在ContentHandler介面中,用SAX解析一個xml檔案主要也就是要根據xml檔案的節點等資訊編寫一個實現ContentHandler介面的實作類別。
 
以下會用SAX解析這個test.xml檔案,並用AndroidTextCase測試結果是否正確。
text.xml檔案內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>liming</name>
<age>30</age>
</person>
<person id="20">
<name>lixiang</name>
<age>25</age>
</person>
</persons>
過程如下:
在Eclipse下建立一個Android項目xml01
建立text.xml檔案,放在src目錄下面
建立一個JavaBean:Person,屬性有id、name、age
編寫一個業務類:SAXPersonService,解析test.xml檔案,這裡重點是根據test.xml檔案中的節點名稱等資訊編寫SAXParserHandler這個內部類,代碼如下:
package com.study.service;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.study.bean.Person;
/**
 * 使用SAX解析text.xml檔案
 * @author Administrator
 *
 */
public class SAXPersonService {
 public List<Person> getPersons(InputStream inputStream) throws Throwable{
  SAXParserFactory factory = SAXParserFactory.newInstance();
  SAXParser parser = factory.newSAXParser();
  SAXParserHandler handler = new SAXParserHandler();
  parser.parse(inputStream, handler);
  return handler.getPersons();
 }
 
 private final class SAXParserHandler extends DefaultHandler{
 
  private List<Person> persons;
  // 記錄正在訪問的文本節點的前一個節點名稱
  private String tag;
  private Person person;
 
  public List<Person> getPersons() {
   return persons;
  }
  @Override
  public void characters(char[] ch, int start, int length)
    throws SAXException {
   if(tag != null){
    if("name".equals(tag)){
     // 根據文本節點取值設定name
     person.setName(new String(ch, start, length));
    }else if("age".equals(tag)){
     // 根據文本節點取值設定age
     person.setAge(Integer.parseInt(new String(ch, start, length)));
    }
   }
  }
  @Override
  public void endElement(String uri, String localName, String qName)
    throws SAXException {
   // localName是不帶命名空間首碼的標籤名
   if("person".equals(localName)){
    // 將person對象加入到集合中
    persons.add(person);
    // person對象設定為null
    person = null;
   }
  
   // 節點結束時一定要將tag設定為null
   // 否則會將空白字元賦值給name和age,從而出錯
   tag = null;
  }
  @Override
  public void startDocument() throws SAXException {
   persons = new ArrayList<Person>();
  }
  @Override
  public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
   // localName是不帶命名空間首碼的標籤名
   if("person".equals(localName)){
    person = new Person();
    // 通過索引尋找屬性的值
    person.setId(Integer.parseInt(attributes.getValue(0)));
   }
  
   tag = localName;
  }
 
 }
}
 
在AndroidManifest.xml加入Android測試所需要的組件
<uses-library android:name="android.test.runner" />
以及
<instrumentation android:name="android.test.InstrumentationTestRunner"
  android:targetPackage="com.study.action" android:label="Tests for My App" />
編寫一個AndroidTestCase:SAXPersonServiceTest,測試代碼如下:
package com.study.action;
import java.io.InputStream;
import java.util.List;
import android.test.AndroidTestCase;
import android.util.Log;
import com.study.bean.Person;
import com.study.service.SAXPersonService;
public class SAXPersonServiceTest extends AndroidTestCase {
 private static final String TAG = "SAXPersonServiceTest";
 public void testGetPersons() throws Throwable{
  SAXPersonService personService = new SAXPersonService();
  InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("test.xml");
  List<Person> persons = personService.getPersons(inputStream);
  for(Person person : persons){
   Log.i(TAG, person.getId() + ", " + person.getName() + ", " + person.getAge());
  }
 }
}
輸入日誌,運行結果如下:

作者“新的啟程”

聯繫我們

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