Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據解析-----解析xml數據

Android數據解析-----解析xml數據

編輯:關於Android編程

我們在開發Android應用的過程中難免會與網絡請求接觸,網路請求獲得的數據一般都是有一定的格式或者約定的形式來返回,這時候我們就需要對返回的數據進行解析,然後從中提取出我們需要呈現在界面上的數據,一般我們遇到的最常見的兩種便於網絡傳輸的數據類型便是xml和json,下面就詳細介紹一下有關他們的解析方式。

一、xml數據解析

首先我們先定義一段xml數據。


    
        1
        Google
        1.0
    
    
        2
        Android
        2.0
    
    
        3
        Play
        3.0
    

方式一、Pull解析xml數據

1、獲得XmlPullParserFactory實例

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

2、 獲得XmlPullParser實例

XmlPullParser xmlPullParser = factory.newPullParser();

3、設置需要解析的數據

xmlPullParser.setInput(new StringReader(xmlData));

4、獲得當前的解析事件

int eventType = xmlPullParser.getEventType();

5、解析結點,知道xml數據解析完成

下面是一個簡單的小例子來解析最上面給出的xml數據

/**
 * 使用Pull解析xml數據
 */
private void parseXmlDataWithPull(String xmlData) {
    try {
        //獲得XmlPullParserFactory實例
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        //獲得XmlPullParser實例
        XmlPullParser xmlPullParser = factory.newPullParser();
        //將需要解析的數據設置進去
        xmlPullParser.setInput(new StringReader(xmlData));
        //獲得當前的解析事件
        int eventType = xmlPullParser.getEventType();
        String id = "";
        String name = "";
        String version = "";
        //判斷解析工作是否完成
        while (eventType != XmlPullParser.END_DOCUMENT){
            String nodeName = xmlPullParser.getName();
            switch (eventType){
                //開始解析某個結點
                case XmlPullParser.START_TAG:
                    if ("id".equals(nodeName)){
                        id = xmlPullParser.nextText();
                    }else if ("name".equals(nodeName)){
                        name = xmlPullParser.nextText();
                    }else if ("version".equals(nodeName)){
                        version = xmlPullParser.nextText();
                    }
                    break;
                //完成解析某個結點
                case XmlPullParser.END_TAG:
                    if ("app".equals(nodeName)){
                        Log.d("xiao", "id " + id);
                        Log.d("xiao", "name " + name);
                        Log.d("xiao", "version " + version);
                    }
                    break;
                default:
                    break;
            }
            //獲取下一個解析事件
            eventType = xmlPullParser.next();
        }

    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

方式二、SAX解析xml數據

SAX解析雖然比Pull解析復雜一點,但在語義理解方面更加清楚,下面是它的具體用法。

1、創建一個類繼承自DefaultHandler,並重寫其中的5個方法。

public class MyHandler extends DefaultHandler {
   private String nodeName;
   private StringBuilder id;
   private StringBuilder name;
   private StringBuilder version;



   //在開始進行xml解析的時候調用
   @Override
   public void startDocument() throws SAXException {
       id = new StringBuilder();
       name = new StringBuilder();
       version = new StringBuilder();
   }

   //開始解析某個結點的時候調用
   @Override
   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
       //記錄當前的結點名
       nodeName = localName;
   }

   //在獲取結點中內容的時候調用
   @Override
   public void characters(char[] ch, int start, int length) throws SAXException {
       //根據當前的結點名判斷將內容添加到哪一個StringBuilder對象中
       if ("id".equals(nodeName)){
           id.append(ch, start, length);
       }else if ("name".equals(nodeName)){
           name.append(ch, start, length);
       }else if ("version".equals(nodeName)){
           version.append(ch, start, length);
       }
   }

   //某個結點解析完成的時候調用
   @Override
   public void endElement(String uri, String localName, String qName) throws SAXException {
       if ("app".equals(localName)){
           //去掉可能包含的回車符和換行符
           Log.d("GGGG", "id " + id.toString().trim());
           Log.d("GGGG", "name " + name.toString().trim());
           Log.d("GGGG", "version " + version.toString().trim());
           //清空StringBuilder
           id.setLength(0);
           name.setLength(0);
           version.setLength(0);
       }
   }

   //完成整個xml解析的時候調用
   @Override
   public void endDocument() throws SAXException {
       super.endDocument();
   }
}

2、獲得SAXParserFactory的實例

SAXParserFactory factory = SAXParserFactory.newInstance();

3、獲得XMLReader的實例

XMLReader xmlReader = factory.newSAXParser().getXMLReader();

4、獲得我們自己定義的處理類的實例

MyHandler handler = new MyHandler();

5、將MyHandler類的實例設置到XMLReader中

xmlReader.setContentHandler(handler);

6、開始解析

xmlReader.parse(new InputSource(new StringReader(xmlData)));

下面給出完整的代碼,解析最上面給出的xml文件

/**
 * 用Sax解析xml數據
 * @param xmlData
 */
private void parseXmlDataWithSax(String xmlData){
    //獲得SAXParserFactory的實例
    SAXParserFactory factory = SAXParserFactory.newInstance();
    try {
        //獲得XMLReader的實例
        XMLReader xmlReader = factory.newSAXParser().getXMLReader();
        //獲得我們自己定義的處理類的實例
        MyHandler handler = new MyHandler();
        //將MyHandler類的實例設置到XMLReader中
        xmlReader.setContentHandler(handler);
        //開始解析
        xmlReader.parse(new InputSource(new StringReader(xmlData)));
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

方式三、Dom解析xml數據

Dom解析也是xml常用的一種解析方式,但由於它在解析時是將整個文檔樹全部加載到內存中,所以它一般只用來解析文檔規模較小的場景,下面是一段簡單的代碼來解析文檔最開頭給出的那段xml文檔。

/**
 * 使用Dom解析xml
 *
 * @param xmlData
 */
private void parseXmlWithDom(String xmlData) {
    //得到DOM解析器的工廠實例
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    //從DOM工廠中獲得DOM解析器
    DocumentBuilder dbBuilder = null;
    try {
        dbBuilder = dbFactory.newDocumentBuilder();
        //把要解析的xml文檔讀入DOM解析器
        Document doc = dbBuilder.parse(new InputSource(new StringReader(xmlData)));
        //得到文檔名稱為app的元素的節點列表
        NodeList nList = doc.getElementsByTagName("app");
        //遍歷該集合,顯示集合中的元素及其子元素的名字
        for(int i = 0; i< nList.getLength() ; i ++){
            //Node轉型WieElement
            Element node = (Element)nList.item(i);
            Log.d("MMMM", "id: "+ node.getElementsByTagName("id").item(0).getFirstChild().getNodeValue());
            Log.d("MMMM", "name: "+ node.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
            Log.d("MMMM", "version: "+ node.getElementsByTagName("version").item(0).getFirstChild().getNodeValue());

        }
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved