Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android之三種方式解析xml(dom,sax,pull)

android之三種方式解析xml(dom,sax,pull)

編輯:關於Android編程

dom 我的理解就是先把整個文檔讀取到內存中,然後才解析,讀取大點的文件的話這樣效率就會很低。而 sax和pull 它們是基於事件解析的。一行一行去解析,效率會高點。

下面就講這三種的用法:

dom解析xml sax解析xml pull解析xml

首先在main創建個assets目錄,創建好後,然後在這目錄下創建個person.xml文件

這裡寫圖片描述

person.xml裡面的內容為:


    
        張三
        22
        通信工程
    
    
        李四
        32
        軟件工程
    
    
        王五
        29
        土木工程
    

接下來我們用三種方法就解析這個內容。掌握解析了這個,其他的基本上也會了。

1 , dom解析xml

activity_main.xml布局文件代碼如下:


很簡單就一個按鈕,還有一個是顯示解析出來的內容,

PersonBean.java代碼如下:

public class PersonBean {
    private int id;
    private String name;
    private int age;
    private String major;

    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 getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    @Override
    public String toString() {
        return "PersonBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", major='" + major + '\'' +
                '}';
    }
}

ParseXMLForDom.java代碼如下:

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

/**
 * Created by Administrator on 2016/10/4.
 */

public class ParseXMLForDom {
    /**
     * dom方式解析xml
     */
    public static List parseXML(InputStream is) throws Exception {
        //獲取集合實例
        List list = new ArrayList<>();
        //獲取DocumentBuilderFactory實例
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        //獲取documentBuilder實例
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        //獲取document實例
        Document document = documentBuilder.parse(is);
        //獲取person節點集合
        NodeList personNodeList = document.getElementsByTagName("person");

        for (int i = 0; i < personNodeList.getLength(); i++) {
            PersonBean bean = new PersonBean();//獲取personbean實例
            Node person = personNodeList.item(i);//獲取person節點
            NamedNodeMap nnm = person.getAttributes();
            /*
             * 獲取person節點的屬性值
             */
            for (int j = 0; j < nnm.getLength(); j++) {
                Node n = nnm.item(j);
                bean.setId(Integer.valueOf(n.getNodeValue()));
            }
            /*
            獲取person裡的子節點,並賦值給bean
             */
            NodeList personChildNodeList = person.getChildNodes();
            for (int j = 0; j < personChildNodeList.getLength(); j++) {
                //獲取person節點的子節點
                Node personChileNode = personChildNodeList.item(j);
                if (Node.ELEMENT_NODE == personChileNode.getNodeType()) {
                    if ("name".equals(personChileNode.getNodeName())) {
                        bean.setName(personChileNode.getTextContent().trim());
                    } else if ("age".equals(personChileNode.getNodeName())) {
                        bean.setAge(Integer.valueOf(personChileNode.getTextContent().trim()));
                    } else if ("major".equals(personChileNode.getNodeName())) {
                        bean.setMajor(personChileNode.getTextContent().trim());
                    }
                }

            }
            list.add(bean);
        }
        return list;
    }

}

這個是dom解析xml,
//獲取DocumentBuilderFactory實例
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//獲取documentBuilder實例
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//獲取document實例
Document document = documentBuilder.parse(is);
這幾步是必須要,我們要拿到整個document實例才能去解析。

MainActivity.java代碼如下:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private TextView mContent;
    private List list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWidgets();//初始化控件
    }

    /**
     * 為按鈕綁定點擊事件
     *
     * @param view
     */
    public void parseXML(View view) {
        parseXMLForDom();

    }

    /**
     * dom解析xml
     */
    private void parseXMLForDom() {
        try {
            list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml"));
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                sb.append(list.get(i).toString() + "\n");
            }
            mContent.setText(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 初始化控件
     */
    private void initWidgets() {
        mContent = (TextView) findViewById(R.id.content);
    }
}

裡面邏輯不難。就不解釋了。。

運行結果:

這裡寫圖片描述

2 , sax解析xml

再創建個MyHandler類繼承DefaultHandler ,代碼如下

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2016/10/4.
 */

public class MyHandler extends DefaultHandler {
    private PersonBean bean;
    private List list;
    private String contentFlag;//只是一個標記,把值放到contentFlag中
    /**
     * 解析到文檔開始調用,一般做初始化操作
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        list=new ArrayList<>();//初始化list
        super.startDocument();
    }

    /**
     * 解析到文檔末尾調用,一般做回收操作
     * @throws SAXException
     */
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    /**
     * 每讀到一個元素就調用該方法
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      //當讀到person節點時就創建一個personbean實例
       if ("person".equals(qName)){
           bean=new PersonBean();
              String id= attributes.getValue("id");
           bean.setId(Integer.valueOf(id));
       }
        super.startElement(uri, localName, qName, attributes);
    }

    /**
     * 讀到元素的結尾調用
     * @param uri
     * @param localName
     * @param qName
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("person".equals(qName)){
            list.add(bean);
            bean=null;//通知jvm回收
        }
        if ("name".equals(qName)){
            bean.setName(contentFlag);
        }else if ("age".equals(qName)){
            bean.setAge(Integer.valueOf(contentFlag));
        }else if ("major".equals(qName)){
            bean.setMajor(contentFlag);
        }
        contentFlag=null;//設為null
        super.endElement(uri, localName, qName);
    }

    /**
     * 讀到屬性內容調用
     * @param ch
     * @param start
     * @param length
     * @throws SAXException
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        contentFlag=new String(ch,start,length).trim();
        super.characters(ch, start, length);
    }

    /**
     * 把list暴露出去,
     * @return
     */
    public List getList() {
        return list;
    }
}

改下MainActivity代碼如下:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import org.xml.sax.SAXException;

import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class MainActivity extends AppCompatActivity {
    private TextView mContent;
    private List list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWidgets();//初始化控件
    }

    /**
     * 為按鈕綁定點擊事件
     *
     * @param view
     */
    public void parseXML(View view) {
       // parseXMLForDom();//dom解析xml
        parseForXMLForSax();//sax解析xml

    }

    /**
     * dom解析xml
     */
    private void parseXMLForDom() {
        try {
            list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml"));
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                sb.append(list.get(i).toString() + "\n");
            }
            mContent.setText(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * sax解析xml
     */
    public void parseForXMLForSax() {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = null;
        try {
            sp = spf.newSAXParser();
            MyHandler handler = new MyHandler();
            sp.parse(getResources().getAssets().open("person.xml"), handler);
            list = handler.getList();//這是解析出來的內容放在list集合中
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                sb.append(list.get(i).toString() + "\n");
            }
            mContent.setText(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    /**
     * 初始化控件
     */
    private void initWidgets() {
        mContent = (TextView) findViewById(R.id.content);
    }
}

運行結果是一樣的,不放出來了

sax解析大概調用方法的順序:

這裡寫圖片描述

3, pull解析xml

創建ParseXMLForPull類代碼如下:

import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2016/10/4.
 */

public class ParseXMLForPull {


    public  static List  parseXML(InputStream is) {
        List list=null;
        PersonBean bean=null;
        XmlPullParser parser = Xml.newPullParser();
        try {
            parser.setInput(is, "utf-8");
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {

                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        list = new ArrayList<>();
                        break;
                    case XmlPullParser.START_TAG:
                        if ("person".equals(parser.getName())) {
                            bean = new PersonBean();
                            String id=  parser.getAttributeValue(null,"id");
                            bean.setId(Integer.valueOf(id));
                        }
                        if (bean != null) {
                            if ("name".equals(parser.getName())) {
                                bean.setName(parser.nextText().trim());
                            } else if ("age".equals(parser.getName())) {
                                bean.setAge(Integer.valueOf(parser.nextText().trim()));
                            } else if ("major".equals(parser.getName())) {
                                bean.setMajor(parser.nextText().trim());
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("person".equals(parser.getName())){
                            list.add(bean);
                            bean=null;
                        }
                        break;
                }
                eventType = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return list;
    }
}

pull也是基於事件解析的,感覺跟sax解析xml差不多、

MainActivity.java代碼如下:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import org.xml.sax.SAXException;

import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class MainActivity extends AppCompatActivity {
    private TextView mContent;
    private List list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWidgets();//初始化控件
    }

    /**
     * 為按鈕綁定點擊事件
     *
     * @param view
     */
    public void parseXML(View view) {
        // parseXMLForDom();//dom解析xml
       // parseForXMLForSax();//sax解析xml
        parseXMLForPull();//pull解析xml

    }

    /**
     * dom解析xml
     */
    private void parseXMLForDom() {
        try {
            list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml"));
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                sb.append(list.get(i).toString() + "\n");
            }
            mContent.setText(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * sax解析xml
     */
    public void parseForXMLForSax() {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = null;
        try {
            sp = spf.newSAXParser();
            MyHandler handler = new MyHandler();
            sp.parse(getResources().getAssets().open("person.xml"), handler);
            list = handler.getList();//這是解析出來的內容放在list集合中
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                sb.append(list.get(i).toString() + "\n");
            }
            mContent.setText(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * pull解析xml
     */
    public void parseXMLForPull() {
        try {
          list=  ParseXMLForPull.parseXML(getResources().getAssets().open("person.xml"));
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                sb.append(list.get(i).toString() + "\n");
            }
            mContent.setText(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 初始化控件
     */
    private void initWidgets() {
        mContent = (TextView) findViewById(R.id.content);
    }
}

運行結果還是一樣的。不放出來了、

總結:

邊學邊寫,終於完成了。dom跟sax解析xml以前是學過的,pull解析xml以前沒接觸過,感覺也不是太難。哈哈。。pull解析xml沒寫什麼解釋,我感覺明白了sax解析xml,pull解析應該也會 了。

源碼下載

AndroidForBlog/tree/master/androidforparsexml">https://github.com/songshuilin/AndroidForBlog/tree/master/androidforparsexml

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved