android教程--xml解析

 

android學習教材—xml解析

一、    知識概要

1、         什麼是SAX

2、         SAX的基本原理

3、         SAX的常用接口

4、         SAX解析

二、    知識詳解

1、         什麼是SAX

a、          SAX全稱Simple API for XML,既是一種接口,也是一個軟件包。

b、         作爲接口,SAX是事件驅動型XML解析的一個標準接口

2、         SAX的基本原理

         SAX的工作原理就是對文件進行順序的描述,掃描的過程是從開始文檔(startDocument),開始元素(startEelement),標籤屬性(characters),結束元素(endEelement),結束文檔(endDocument),一直把這個xml文件掃描完爲止。如以下是一個xml文件,startDocument()是開始掃描這個文件,startEelement()開始掃描到第一個標籤<resources>元素,然後掃描到<resource>,然後掃描到<mp3_name>接着characters()掃描到標籤中的屬性值“愛的供養.mp3”,之後endEelement()依次掃描到</mp3_name>,</resource>,</resources>,最後,endDocument()結束文件的掃描。

<?xml version="1.0" encoding="ISO-8859-1"?>

<resources>

    <resource>

        <mp3_name>愛的供養.mp3</mp3_name>

    </resource>

</resources>


3、         SAX的常用接口

接口:

ContentHandler(常用的接口)

ErrorHandler

DTDHandler

EntityResolver

ContentHandler的方法:

      void startDocument()

      void endDocument()

      void startElement(String url,String localName,String qName,Attributes attributes)

      void endElement(String url,String localName,String qName)

      void characters(char[] ch,int start,int length)

4、SAX解析

在此src中一共有三個文件:

a、 Activity_xml.java

        在此activity中得到一個按鈕控件,然後爲此控件設置一個監聽器,在監聽器方法中調用文件下載類HttpDownloader.java,然後得到下載的xml文件後就開始解析此文件,解析xml文件的4個步驟是:

l       創建SAX工廠:SAXParserFactory saxParserFactory=SAXParserFactory.newInstance;

l       創建xmlReader:XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReade();

l       爲xmlReader設置內容處理器,就是調用MyContentHandler.java類:xmlReader.setContentHandler(new MyContentHandler());

l       開始解析:xmlReader.parse(new InputSource(new StringReader(url)));

package com.wyt.Activity_xml;

 

import java.io.IOException;

 

import java.io.StringReader;

 

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParserFactory;

 

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

import org.xml.sax.XMLReader;

 

import com.wyt.downloader.HttpDownloader;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

 

public class Activity_xml extends Activity {

      /** Called when the activity is first created. */

      private Button myButton;

 

      @Override

      public void onCreate(Bundle savedInstanceState) {

           super.onCreate(savedInstanceState);

           setContentView(R.layout.main);

           myButton = (Button) findViewById(R.id.myButton);

           myButton.setOnClickListener(new getXMLlistener());

      }

      public class getXMLlistener implements OnClickListener {

 

           public void onClick(View v) {

                 // TODO Auto-generated method stub

                 // 創建下載xml文件對象

                 HttpDownloader httpDownloader = new HttpDownloader();

                 

                 try {

                 // 調用httpDownloader()下載resources.xml文件

                 String url = httpDownloader

                            .Download("http://10.0.2.2:8080/MP3/resources.xml");

                 System.out.println("!!!!!!!!!!");

                 System.out.println("@@@@@"+url);

                 

                      // 解析xml文件

                      // 1、創建SAX工廠

                      SAXParserFactory saxParserFactory = SAXParserFactory

                                  .newInstance();

                      // 2、創建xmlReader

                      XMLReader xmlReader = saxParserFactory.newSAXParser()

                                  .getXMLReader();

                      // 3、爲xmlReader設置內容處理文件

                      xmlReader.setContentHandler(new MyContentHandler());

                      // 4、開始解析文件

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

                 } catch (IOException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                 } catch (SAXException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                 } catch (ParserConfigurationException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                 }

           }

      }

}

 

b、         HttpDownloader.java

package com.wyt.downloader;

 

import java.io.BufferedReader;

 

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

 

public class HttpDownloader{

    private URL url=null;

       

       //根據url下載文件,前提是這個文件是文本文件,函數的返回值是文件中的內容

       public String Download(String urlStr){

       

           StringBuffer sb=new StringBuffer();

           String line=null;

           BufferedReader br=null;

           

           try {

              //創建一個url連接

              url=new URL(urlStr);

              

              //創建一個HTTP連接

              HttpURLConnection hURLConn=(HttpURLConnection) url.openConnection();

              

              //使用IO流讀取數據

              br=new BufferedReader(new InputStreamReader(hURLConn.getInputStream()));

              

              while((line=br.readLine())!=null){

                  //將這些字符添加到緩衝區的末端

                  sb.append(line);

              }

               

              //關閉流

              br.close();

           } catch (MalformedURLException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           } catch (IOException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

           

           return sb.toString();

       }

 

    }

c、          MyContentHandler.java

package com.wyt.Activity_xml;

 

import org.xml.sax.Attributes;

 

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

 

public class MyContentHandler extends DefaultHandler {

      String mp3_name, mp3_size, lrc_name, lrc_size, resource;

      String taglib;

 

      @Override

      public void startDocument() throws SAXException {

           // TODO Auto-generated method stub

           System.out.println("------srart-------");

      }

 

      @Override

      public void endDocument() throws SAXException {

            // TODO Auto-generated method stub

           System.out.println("------end-------");

      }

 

      @Override

      public void startElement(String uri, String localName, String qName,

                 Attributes attributes) throws SAXException {

           // TODO Auto-generated method stub

           taglib = localName;

           System.out.println("${1}quot;);

           if (localName.equals("resource")) {

                 // 獲取標籤的全部屬性

                 for (int i = 0; i < attributes.getLength(); i++) {

                      System.out.println(attributes.getLocalName(i) + "="

                                  + attributes.getValue(i));

                 }

           }

      }

 

      @Override

      public void endElement(String uri, String localName, String qName)

                 throws SAXException {

           // TODO Auto-generated method stub

           // 在workr標籤解析完之後,會打印出所有得到的數據

           taglib = "";

           if (localName.equals("resource")) {

                 this.printout();

           }

      }

 

      @Override

      public void characters(char[] ch, int start, int length)

                 throws SAXException {

           // TODO Auto-generated method stub

           if (taglib.equals("mp3_name")) {

                 mp3_name = new String(ch, start, length);

           } else if (taglib.equals("mp3_size")) {

                 mp3_size = new String(ch, start, length);

           } else if (taglib.equals("lrc_name")) {

                 lrc_name = new String(ch, start, length);

           } else if (taglib.equals("lrc_size")) {

                 lrc_size = new String(ch, start, length);

           }

      }

      private void printout() {

           System.out.print("mp3_name");

           System.out.println(mp3_name);

           System.out.print("mp3_size");

           System.out.println(mp3_size);

           System.out.print("lrc_name");

           System.out.println(lrc_name);

           System.out.print("lrc_size");

           System.out.println(lrc_size);

           System.out.println();

      }

}


d、 resources.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<resources>

    <resource>

        <mp3_name>愛的供養.mp3</mp3_name>

        <mp3_size>2766528</mp3_size>

        <lrc_name>愛的供養.lrc</lrc_name>

        <lrc_size>1023</lrc_size>

    </resource>

    <resource>

        <mp3_name>客官不可以.mp3</mp3_name>

        <mp3_size>1603258</mp3_size>

        <lrc_name>客官不可以.lrc</lrc_name>

        <lrc_size>1923</lrc_size>

    </resource>

</resources>


三、    學習心得

        學習這個知識點的時候,我遇到了一個很常見的問題,就是ANR,全稱是Application Not Responding,當時我反覆檢查了我的代碼,都沒有錯,然後我又把tomcat關掉又重啓還是沒有用,然後我就百度,關於這個問題的信息倒是挺多的,但是都沒有說過所以然,此刻我就把下載xml文件的地址從本機地址改爲10.10.2.2,沒想到居然運行成功,這個我也百思不得其解,還記得上篇學習的文件下載,我就用的是本機地址,那個是OK的,但爲什麼這個就不成功呢,希望有知道的朋友幫我解釋解釋哈!!謝謝了!!

       從這次我明白了寫代碼不要怕錯,也不要怕不可以,不要被知識的框架給套住了,要跳出來思考,有句話說的對,旁觀者清,或許你從另一個方向來思考就能解決問題,所以要學會從多方面來考慮問題,要嘗試去試試,不試怎麼會知道結果呢!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章