Android中解析XML格式數據的方法

XML介紹:Extensible Markup Language,便可擴展標記語言html

1、概述

Android中解析XML格式數據大體有三種方法:android

  • SAX
  • DOM
  • PULL

2、詳解

2.1 SAX

SAX(Simple API for XML) 使用流式處理的方式,它並不記錄所讀內容的相關信息。git

它是一種以事件爲驅動的XML API,解析速度快,佔用內存少。使用回調函數來實現。github

缺點是不能倒退。編程

2.2 DOM

DOM(Document Object Model) 是一種用於XML文檔的對象模型,可用於直接訪問 XML 文檔的各個部分。dom

它是一次性所有將內容加載在內存中,生成一個樹狀結構,它沒有涉及回調和複雜的狀態管理。函數

缺點是加載大文檔時效率低下。佈局

2.3 PULL

Pull 內置於 Android 系統中。也是官方解析佈局文件所使用的方式。ui

Pull 與 SAX 有點相似,都提供了相似的事件,如開始元素和結束元素。this

不一樣的是,SAX 的事件驅動是回調相應方法,須要提供回調的方法,然後在 SAX 內部自動調用相應的方法。

而Pull解析器並無強制要求提供觸發的方法。由於他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。

3、比較

SAX、DOM、Pull 的比較:

內存佔用:SAX、Pull比DOM要好;

編程方式:SAX 採用事件驅動,在相應事件觸發的時候,會調用用戶編好的方法,也即每解析一類 XML,就要編寫一個新的適合該類XML的處理類。DOM 是 W3C 的規範,Pull 簡潔。

訪問與修改:SAX 採用流式解析,DOM 隨機訪問。

訪問方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。

4、使用舉例

4.1 SAX 解析舉例

http://www.saxproject.org/quickstart.html

4.2 DOM 解析舉例

public class DomPersonService {
    /**
     * @param inStream
     * @return
     * @throws Exception
     */
    public static List<Person> getPersons(InputStream inStream)
            throws Exception {

        List<Person> persons = new ArrayList<Person>();
        /**
         * 文檔的解析
         */
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(inStream);
        /**
         * 操做對象樹
         */
        Element root = document.getDocumentElement();//返回文檔的根元素
        NodeList personNodes = root.getElementsByTagName("person");
        for (int i = 0; i < personNodes.getLength(); i++) {
            Element personElement = (Element) personNodes.item(i);
            int id = new Integer(personElement.getAttribute("id"));
            Person person = new Person();
            person.setId(id);
            NodeList childNodes = personElement.getChildNodes();
            for (int y = 0; y < childNodes.getLength(); y++) {
                if (childNodes.item(y).getNodeType() == Node.ELEMENT_NODE) {
                    if ("name".equals(childNodes.item(y).getNodeName())) {
                        String name = childNodes.item(y).getFirstChild()
                                .getNodeValue();
                        person.setName(name);
                    }
                    else if ("age".equals(childNodes.item(y).getNodeName())) {
                        String age = childNodes.item(y).getFirstChild()
                                .getNodeValue();
                        person.setAge(new Short(age));
                    }
                }
            }
            persons.add(person);
        }
        inStream.close();
        return persons;
    }
}
public void testDOMGetPersons() throws Throwable {
    InputStream inStream = this.getClass().getClassLoader()
        .getResourceAsStream("person.xml");
    List<Person> persons = DomPersonService.getPersons(inStream);
    for (Person person : persons) {
        Log.i(TAG, person.toString());
     }
}

4.3 PULL解析舉例

public class PullPersonService {

    /**
     * ------------------------使用PULL解析XML-----------------------
     * @param inStream
     * @return
     * @throws Exception
     */
    public static List<Person> getPersons(InputStream inStream)
            throws Exception {
        Person person = null;
        List<Person> persons = null;
        XmlPullParser pullParser = Xml.newPullParser();
        pullParser.setInput(inStream, "UTF-8");
        int event = pullParser.getEventType();// 觸發第一個事件
        while (event != XmlPullParser.END_DOCUMENT) {
            switch (event) {
            case XmlPullParser.START_DOCUMENT:
                persons = new ArrayList<Person>();
                break;
            case XmlPullParser.START_TAG:
                if ("person".equals(pullParser.getName())) {
                    int id = new Integer(pullParser.getAttributeValue(0));
                    person = new Person();
                    person.setId(id);
                }
                if (person != null) {
                    if ("name".equals(pullParser.getName())) {
                        person.setName(pullParser.nextText());
                    }
                    if ("age".equals(pullParser.getName())) {
                        person.setAge(new Short(pullParser.nextText()));
                    }
                }
                break;
            case XmlPullParser.END_TAG:
                if ("person".equals(pullParser.getName())) {
                    persons.add(person);
                    person = null;
                }
                break;
            }
            event = pullParser.next();
        }
        return persons;
    }
}
public void testPullGetPersons() throws Throwable {
    InputStream inStream = this.getClass().getClassLoader()
            .getResourceAsStream("person.xml");
    List<Person> persons = PullPersonService.getPersons(inStream);
    for (Person person : persons) {
        Log.i(TAG, person.toString());
    }
}

此文在個人 Github Pages 上同步發佈,地址爲:Android中解析XML格式數據的方法

相關文章
相關標籤/搜索