SAX(simpleAPIforXML)是一種XML解析的替代方法。相比於DOM,SAX是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。而且相比於DOM,SAX可以在解析文檔的任意時刻停止解析,但任何事物都有其相反的一面,對於SAX來說就是操作復雜。
SAX實現實體解析的步驟:
在android中使用SAX是有跡可循的,完全可以按照下面的方法就可以輕松找到xml裡的tag,然後得到想要的內容。具體實現步驟如下:
(一)第一步:新建一個工廠類SAXParserFactory,代碼如下:
SAXParserFactory factory = SAXParserFactory.newInstance();
(二)第二步:讓工廠類產生一個SAX的解析類SAXParser,代碼如下:
SAXParser parser = factory.newSAXParser();
(三)第三步:從SAXPsrser中得到一個XMLReader實例,代碼如下:
XMLReader reader = parser.getXMLReader();
(四)第四步:把自己寫的handler注冊到XMLReader中,一般最重要的就是ContentHandler,代碼如下:
RSSHandler handler = new RSSHandler(); reader.setContentHandler(handler);
(五)第五步:將一個xml文檔或者資源變成一個java可以處理的InputStream流後,解析正式開始,代碼如下:
parser.parse(is);
上面幾個步驟中,最重要、最關鍵的就是第四步,handler的實現。
一、設計界面
1、布局文件
打開activity_main.xml文件。
輸入以下代碼:
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
-
- <Button
- android:id="@+id/read"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="讀取XML文件(SAX)" />
-
- </LinearLayout>
二、程序文件
1、新建“Book.java”文件
[java] view plain copy
- package com.genwoxue.filesax;
-
- public class Book{
- private String bookName;
- private String author;
- private String publisher;
-
- //設置書名
- public void setBookName(String name){
- this.bookName=name;
- }
-
- //獲取書名
- public String getBookName(){
- return bookName;
- }
-
- //設置作者
- public void setAuthor(String author){
- this.author=author;
- }
-
- //獲取作者
- public String getAuthor(){
- return author;
- }
-
- //設置出版社
- public void setPublisher(String publisher){
- this.publisher=publisher;
- }
-
- //獲取出版社
- public String getPublisher(){
- return publisher;
- }
-
- }
2、新建“SAX.java”文件
[java] view plain copy
- package com.genwoxue.filesax;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
-
-
- public class SAX extends DefaultHandler {
- private List<Book> list=null;
- private String elementName=null;
- private Book book=null;
-
- //文檔開始
- @Override
- public void startDocument() throws SAXException{
- this.list=new ArrayList<Book>();
- }
-
- //元素開始
- @Override
- public void startElement(String uri,String localName,String name,Attributes attributes) throws SAXException{
- if("book".equals(localName)){
- this.book=new Book();
- }
- this.elementName=localName;
- }
-
- //
- @Override
- public void characters(char[] ch,int start,int len) throws SAXException{
- if(this.elementName!=null){
- String cont=new String(ch,start,len);
- if("bookname".equals(this.elementName))
- this.book.setBookName(cont);
- if("author".equals(this.elementName))
- this.book.setAuthor(cont);
- if("publisher".equals(this.elementName))
- this.book.setPublisher(cont);
-
- }
- }
-
- @Override
- public void endElement(String uri,String localName,String name) throws SAXException{
- if("book".equals(localName)){
- this.list.add(this.book);
- this.book=null;
- }
- this.elementName=null;
- }
-
- public List<Book> getAll(){
- return this.list;
- }
-
- }
3、打開“src/com.genwoxue.filesax/MainActivity.java”文件。
然後輸入以下代碼:
[java] view plain copy
- package com.genwoxue.filesax;
-
- import java.io.File;
- import java.io.IOException;
- import java.util.List;
-
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParserFactory;
- import javax.xml.parsers.SAXParser;
-
- import org.xml.sax.SAXException;
-
- import android.os.Bundle;
- import android.os.Environment;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- import android.app.Activity;
-
- public class MainActivity extends Activity {
-
- private Button btnRead=null;
- private File file=null;
- private static final String FILENAME="book.xml";
- private StringBuffer info=null;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btnRead=(Button)super.findViewById(R.id.read);
-
- btnRead.setOnClickListener(new OnClickListener(){
- public void onClick(View v)
- {
- //判斷外部存儲卡是否存在
- if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- Toast.makeText(getApplicationContext(), "讀取失敗,SD存儲卡不存在!", Toast.LENGTH_LONG).show();
- return;
- }
-
- //判斷文件是否存在
- String path=Environment.getExternalStorageDirectory().toString()+File.separator+"genwoxue"+File.separator+FILENAME;
- file=new File(path);
- if(!file.exists()){
- Toast.makeText(getApplicationContext(), "XML文件不存在!", Toast.LENGTH_LONG).show();
- return;
- }
-
- //建立SAX解析
- SAXParserFactory factory=SAXParserFactory.newInstance();
- //構造解析器
- SAXParser parser=null;
- //建立SAX解析器
- SAX sax=new SAX();
- //獲得SAXParser對象
- try {
- parser=factory.newSAXParser();
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- }
-
- try {
- parser.parse(file, sax);
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
-
- info=new StringBuffer();
- //遍歷列表,獲取書籍信息
- List<Book> list=sax.getAll();
- for(int pos=0;pos<list.size();pos++){
- info.append("書名:").append(list.get(pos).getBookName()).append("☆☆☆\n");
- info.append("作者:").append(list.get(pos).getAuthor()).append("☆☆☆\n");
- info.append("出版社:").append(list.get(pos).getPublisher()).append("☆☆☆\n");
- }
-
- Toast.makeText(getApplicationContext(), info.toString(), Toast.LENGTH_LONG).show();
- }
- });
- }
-
- }
三、配置文件
打開“AndroidManifest.xml”文件。
然後輸入以下代碼:
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.genwoxue.filesax"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="15" />
- <span style="color:#ff0000;"><strong><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
- </strong></span>
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.genwoxue.filesax.MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
-
- </manifest>
注意:由於要進行讀外部存儲卡操作,故而需要在AndroidManifest.xml文件中添加一項權限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
四、運行結果