Android幾種解析XML方式的比較

來源:互聯網
上載者:User

標籤:lis   star   word   type   比較   final   title   ***   person   

52371342

一、使用SAX解析XML

SAX(Simple API for XML) 使用串流的方式,它並不記錄所讀內容的相關資訊。它是一種以事件為驅動的XML API,解析速度快,佔用記憶體少。使用回呼函數來實現。 缺點是不能倒退。

二、使用DOM解析XML

DOM(Document Object Model) 是一種用於XML文檔的物件模型,可用於直接存取XML文檔的各個部分。它是一次性全部將內容載入在記憶體中,產生一個樹狀結構,它沒有涉及回調和複雜的狀態管理。 缺點是載入大文檔時效率低下。

三、使用Pull解析XML

Pull內建於Android系統中。也是官方解析布局檔案所使用的方式。Pull與SAX有點類似,都提供了類似的事件,如開始元素和結束元素。不同的是,SAX的事件驅動是回調相應方法,需要提供回調的方法,而後在SAX內部自動調用相應的方法。而Pull解析器並沒有強制要求提供觸發的方法。因為他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。

四、SAX、DOM、Pull的比較:
  • 記憶體佔用:SAX、Pull比DOM要好;
  • 編程方式:SAX採用事件驅動,在相應事件觸發的時候,會調用使用者編好的方法,也即每解析一類XML,就要編寫一個新的適合該類XML的處理類。DOM是W3C的規範,Pull簡潔。
  • 訪問與修改:SAX採用流式解析,DOM隨機訪問。
  • 訪問方式:SAX,Pull解析的方式是同步的,DOM逐字逐句。
四、各種解析舉例1、SAX解析舉例

解析代碼:

public class SAXForHandler extends DefaultHandler {    /**     * -----------------SAX解析XML----------------------     */    private static final String TAG = "SAXForHandler";    private List<Person> persons;    private String perTag;// 通過此變數,記錄前一個標籤的名稱    Person person;// 記錄當前Person    public List<Person> getPersons() {        return persons;    }    @Override    public void characters(char[] ch, int start, int length)            throws SAXException {        String data = new String(ch, start, length).trim();        if ( ! "".equals(data.trim())) {            Log.i(TAG, "content: " + data.trim());        }        if ("name".equals(perTag)) {            person.setName(data);        }        else if ("age".equals(perTag)) {            person.setAge(new Short(data));        }        super.characters(ch, start, length);    }    @Override    public void endDocument() throws SAXException {        Log.i(TAG, "***endDocument()***");        super.endDocument();    }    @Override    public void endElement(String uri, String localName, String qName)            throws SAXException {        Log.i(TAG, qName + "***endElement()***");        if ("person".equals(localName)) {            persons.add(person);            person = null;        }        perTag = null;        super.endElement(uri, localName, qName);    }    @Override    public void startDocument() throws SAXException {        persons = new ArrayList<Person>();        Log.i(TAG, "***startDocument()***");        super.startDocument();    }    @Override    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {//localName標籤名,fullName帶命名空間的標籤名,attribute存放該標籤所有屬性        if ("person".equals(localName)) {            for (int i = 0; i < attributes.getLength(); i++) {                Log.i(TAG, "attributeName:" + attributes.getLocalName(i)                        + "_attribute_Value:" + attributes.getValue(i));                person = new Person();                person.setId(Integer.valueOf(attributes.getValue(i)));                // person.setId(Integer.parseInt(attributes.getValue(i)));            }        }        perTag = localName;        Log.i(TAG, qName + "***startElement()***");        super.startElement(uri, localName, qName, attributes);    }}
  • 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

使用SAX解析:

/** * *****************************使用SAX解析XML檔案******************* * 輸入資料流是指向程式中讀入資料 * @throws Throwable */public void testSAXGetPersons() throws Throwable {    InputStream inputStream = this.getClass().getClassLoader()        .getResourceAsStream("person.xml");    SAXForHandler saxForHandler = new SAXForHandler();    /**     * 用工廠模式解析XML     */    SAXParserFactory spf = SAXParserFactory.newInstance();    SAXParser saxParser = spf.newSAXParser();    saxParser.parse(inputStream, saxForHandler);    // 第二種方式解析XML    // XMLReader xmlReader = saxParser.getXMLReader();    // xmlReader.setContentHandler(handler);            // xmlReader.parse(new InputSource(inputStream));    List<Person> persons = saxForHandler.getPersons();    inputStream.close();    for (Person person : persons) {        Log.i(TAG, person.toString());    }}
  • 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
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;    }}
  • 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

使用DOM解析XML檔案

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());     }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
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;    }}
  • 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

PULL解析XML檔案

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());    }}

Android幾種解析XML方式的比較

相關文章

聯繫我們

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