[Android學習]XML文本的三種解析方式(通過搭建本地的Web項目提供XML檔案)

來源:互聯網
上載者:User

XML為一種可擴充的標記語言,是一種簡單的資料存放區語言,使用一系列簡單的標記來描述。

一、SAX解析

  即Simple API for XML,以事件的形式通知程式,對Xml進行解析。

  1、首先在Web項目中發布一個XML文檔,名字為persons.xml,具體內容為: 

            周杰倫        20                小明        21    

  2、SAX解析的流程主要如下:

  

  通過建立SAXParserFactory對象獲得一個執行個體,然後再通過工廠獲得一個SaxParser,依靠SaxParser的parse方法,完成解析,其中parse方法的參數為一個InputStream類和一個DefaultHandler類,defaultHandler需     要重寫

    SAXParserFactory spf = SAXParserFactory.newInstance();       SAXParser parse = spf.newSAXParser();       Myhandler handler = new Myhandler("person");       parse.parse(is, handler);       list = handler.getList();

  

  3、重寫處理類DefaultHandler。

  

  

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class Myhandler extends DefaultHandler {    List> list = null;// 儲存所有的解析對象    String currentTag = null; // 正在解析的標籤    String currentValue = null; // 正在解析元素的值    String nodename = null; // 正在解析節點名稱    HashMap map = null;// 儲存單個解析的完整對象    public Myhandler(String nodename) {        this.nodename = nodename;    }    public List> getList() {        return list;    }    @Override    // 讀到第一個開始標籤的時候觸發    public void startDocument() throws SAXException {        list = new ArrayList>();    }    @Override    // 當遇到所要解析的節點名稱時觸發    public void startElement(String uri, String localName, String qName,            Attributes attributes) throws SAXException {        if (qName.equals(nodename)) {            map = new HashMap();        }        if (attributes != null && map != null) {            for (int i = 0; i < attributes.getLength(); i++) {                map.put(attributes.getQName(i), attributes.getValue(i));            }        }        currentTag = qName;    }    @Override    public void endElement(String uri, String localName, String qName)            throws SAXException {        if (qName.equals(nodename)) {            list.add(map);            map = null;        }        super.endElement(uri, localName, qName);    }    @Override    // 處理xml檔案讀取到的內容    public void characters(char[] ch, int start, int length)            throws SAXException {        if (currentTag != null && map != null) {            currentValue = new String(ch, start, length);            if (currentValue != null && !currentValue.trim().equals("")                    && !currentValue.trim().equals("\n")) {                map.put(currentTag, currentValue);            }        }        currentTag = null;        currentValue = null;    }}

  

  

  

  4、通過自訂的HttpUtils類,從伺服器擷取資料,以流的形式返回,也就是XML文檔的輸入資料流,這裡不再給出,關於獲得伺服器資料的三種方式下次會下次更新。

 

  5、最後通過返回的List> 獲得了XML文檔的所需要的內容,需要提到的是,我在這裡是需要解析person節點,於是只有qName等於person時候才會開始解析。

 

二、PULL解析

  類似於SAX方式,程式以“拉取”的方式對Xml進行解析。

  1、與SAX解析類似,但比SAX解析容易,需要JAR包,:

http://pan.baidu.com/s/1hq3JnKg

  2、首先通過XMLPullFactory建立一個工廠,然後再由工廠建立一個XMLPullParser對象,由對象進行相關處理。

  3、通過對eventType進行XML檔案的節點解析,獲得資料,並存放在List中進行返回。

import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;public class PullXmlHandler {    public static List parseXml(InputStream is, String encode)            throws Exception {        List list = null;        Person p = null;        try {            XmlPullParserFactory xmlPullF = XmlPullParserFactory.newInstance();            XmlPullParser parser = xmlPullF.newPullParser();            parser.setInput(is, encode);            int eventType = parser.getEventType();          //如果還沒到文檔結束節點就一直迴圈            while (eventType != XmlPullParser.END_DOCUMENT) {                switch (eventType) {                case XmlPullParser.START_DOCUMENT:                    list = new ArrayList();                    break;                case XmlPullParser.START_TAG:                    if (parser.getName().equals("person")) {                        p = new Person();                        if (parser.getAttributeCount() != 0) {                            p.setId(parser.getAttributeValue(0));                        }                    } else if (parser.getName().equals("name")) {                        p.setName(parser.nextText());                    } else if (parser.getName().equals("age")) {                        p.setAge(parser.nextText());                    }                    break;                case XmlPullParser.END_TAG:                    if (parser.getName().equals("person")) {                        list.add(p);                        p = null;                    }                    break;                default:                    break;                }        //進行下次迴圈                 eventType = parser.next();            }        } catch (XmlPullParserException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return list;    }} 
三、DOM解析

  “文件物件模型”方式,解析完的Xml將產生一個樹狀結構的對象。

  1、DOM解析相對前兩種比較麻煩,代碼如下:

  

import java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import com.xml.httputils.http_post;public class DomService {    public DomService() {    }    public static List parseXML(InputStream is) throws Exception {        List list = new ArrayList();        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        DocumentBuilder builder = factory.newDocumentBuilder();        Document document = builder.parse(is);        // 獲得節點        Element element = document.getDocumentElement();        NodeList nodeList = element.getElementsByTagName("person");        for (int i = 0; i < nodeList.getLength(); i++) {            Element personElement = (Element) nodeList.item(i);            Person p = new Person();            p.setId(personElement.getAttribute("id"));            NodeList personList = personElement.getChildNodes();            for (int j = 0; j < personList.getLength(); j++) {                if (personList.item(j).getNodeType() == Node.ELEMENT_NODE) {                    if ("name".equals(personList.item(j).getNodeName())) {                        p.setName(personList.item(j).getFirstChild()                                .getNodeValue());                    } else if ("age".equals(personList.item(j).getNodeName())) {                        p.setAge(personList.item(j).getFirstChild()                                .getNodeValue());                    }                }            }            list.add(p);        }        return list;    }    public static void main(String[] args) throws Exception {        DomService dom = new DomService();        List ps = dom.parseXML(http_post.getXMLStream());        for (Person p : ps) {            System.out.println(p);        }    }}

 

總結:

  對於小記憶體的裝置,尤其是Android裝置,使用PULL解析或者SAX解析遠優於DOM解析。

聯繫我們

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