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的,但爲什麼這個就不成功呢,希望有知道的朋友幫我解釋解釋哈!!謝謝了!!
從這次我明白了寫代碼不要怕錯,也不要怕不可以,不要被知識的框架給套住了,要跳出來思考,有句話說的對,旁觀者清,或許你從另一個方向來思考就能解決問題,所以要學會從多方面來考慮問題,要嘗試去試試,不試怎麼會知道結果呢!!!!!