Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android技術基礎 >> 第63章、XML文件-SAX操作(從零開始學Android)

第63章、XML文件-SAX操作(從零開始學Android)

編輯:Android技術基礎

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  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <Button  
  9.         android:id="@+id/read"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="讀取XML文件(SAX)" />  
  13.   
  14. </LinearLayout>  

 

二、程序文件

 

 1、新建“Book.java”文件

[java] view plain copy  
  1. package com.genwoxue.filesax;  
  2.   
  3. public class Book{  
  4.     private String bookName;  
  5.     private String author;  
  6.     private String publisher;  
  7.       
  8.     //設置書名  
  9.     public void setBookName(String name){  
  10.         this.bookName=name;  
  11.     }  
  12.       
  13.     //獲取書名  
  14.     public String getBookName(){  
  15.         return bookName;  
  16.     }  
  17.       
  18.     //設置作者  
  19.     public void setAuthor(String author){  
  20.         this.author=author;  
  21.     }  
  22.       
  23.     //獲取作者  
  24.     public String getAuthor(){  
  25.         return author;  
  26.     }  
  27.       
  28.     //設置出版社  
  29.     public void setPublisher(String publisher){  
  30.         this.publisher=publisher;  
  31.     }  
  32.       
  33.     //獲取出版社  
  34.     public String getPublisher(){  
  35.         return publisher;  
  36.     }  
  37.       
  38. }  


2、新建“SAX.java”文件

[java] view plain copy  
  1. package com.genwoxue.filesax;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.xml.sax.Attributes;  
  7. import org.xml.sax.SAXException;  
  8. import org.xml.sax.helpers.DefaultHandler;  
  9.   
  10.   
  11. public class SAX extends DefaultHandler {  
  12.     private List<Book> list=null;  
  13.     private String elementName=null;  
  14.     private Book book=null;  
  15.       
  16.     //文檔開始  
  17.     @Override  
  18.     public void startDocument() throws SAXException{  
  19.         this.list=new ArrayList<Book>();  
  20.     }  
  21.       
  22.     //元素開始  
  23.     @Override  
  24.     public void startElement(String uri,String localName,String name,Attributes attributes) throws SAXException{  
  25.         if("book".equals(localName)){  
  26.             this.book=new Book();  
  27.         }  
  28.         this.elementName=localName;  
  29.     }  
  30.       
  31.     //  
  32.     @Override  
  33.     public void characters(char[] ch,int start,int len) throws SAXException{  
  34.         if(this.elementName!=null){  
  35.             String cont=new String(ch,start,len);  
  36.             if("bookname".equals(this.elementName))  
  37.                 this.book.setBookName(cont);  
  38.             if("author".equals(this.elementName))  
  39.                 this.book.setAuthor(cont);  
  40.             if("publisher".equals(this.elementName))  
  41.                 this.book.setPublisher(cont);  
  42.               
  43.         }  
  44.     }  
  45.       
  46.     @Override  
  47.     public void endElement(String uri,String localName,String name) throws SAXException{  
  48.         if("book".equals(localName)){  
  49.             this.list.add(this.book);  
  50.             this.book=null;  
  51.         }  
  52.         this.elementName=null;  
  53.     }  
  54.       
  55.     public List<Book> getAll(){  
  56.         return this.list;  
  57.     }  
  58.       
  59. }  


3、打開“src/com.genwoxue.filesax/MainActivity.java”文件。

然後輸入以下代碼:

[java] view plain copy  
  1. package com.genwoxue.filesax;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.List;  
  6.   
  7. import javax.xml.parsers.ParserConfigurationException;  
  8. import javax.xml.parsers.SAXParserFactory;  
  9. import javax.xml.parsers.SAXParser;  
  10.   
  11. import org.xml.sax.SAXException;  
  12.   
  13. import android.os.Bundle;  
  14. import android.os.Environment;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18. import android.widget.Toast;  
  19. import android.app.Activity;  
  20.   
  21. public class MainActivity extends Activity {  
  22.   
  23.     private Button btnRead=null;  
  24.     private File file=null;  
  25.     private static final String FILENAME="book.xml";  
  26.     private StringBuffer info=null;  
  27.       
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.         btnRead=(Button)super.findViewById(R.id.read);  
  33.           
  34.         btnRead.setOnClickListener(new OnClickListener(){  
  35.             public void onClick(View v)  
  36.             {    
  37.                 //判斷外部存儲卡是否存在  
  38.                 if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  39.                     Toast.makeText(getApplicationContext(), "讀取失敗,SD存儲卡不存在!", Toast.LENGTH_LONG).show();    
  40.                     return;  
  41.                 }  
  42.                   
  43.                 //判斷文件是否存在  
  44.                 String path=Environment.getExternalStorageDirectory().toString()+File.separator+"genwoxue"+File.separator+FILENAME;  
  45.                 file=new File(path);  
  46.                 if(!file.exists()){  
  47.                     Toast.makeText(getApplicationContext(), "XML文件不存在!", Toast.LENGTH_LONG).show();    
  48.                     return;  
  49.                 }  
  50.                   
  51.                 //建立SAX解析  
  52.                 SAXParserFactory factory=SAXParserFactory.newInstance();  
  53.                 //構造解析器  
  54.                 SAXParser parser=null;  
  55.                 //建立SAX解析器  
  56.                 SAX sax=new SAX();  
  57.                 //獲得SAXParser對象  
  58.                 try {  
  59.                     parser=factory.newSAXParser();  
  60.                 } catch (ParserConfigurationException e) {  
  61.                     e.printStackTrace();  
  62.                 } catch (SAXException e) {  
  63.                     e.printStackTrace();  
  64.                 }  
  65.                   
  66.                 try {  
  67.                     parser.parse(file, sax);  
  68.                 } catch (SAXException e) {  
  69.                     e.printStackTrace();  
  70.                 } catch (IOException e) {  
  71.                     e.printStackTrace();  
  72.                 }  
  73.                   
  74.                   
  75.                 info=new StringBuffer();  
  76.                 //遍歷列表,獲取書籍信息  
  77.                 List<Book> list=sax.getAll();  
  78.                 for(int pos=0;pos<list.size();pos++){  
  79.                     info.append("書名:").append(list.get(pos).getBookName()).append("☆☆☆\n");  
  80.                     info.append("作者:").append(list.get(pos).getAuthor()).append("☆☆☆\n");  
  81.                     info.append("出版社:").append(list.get(pos).getPublisher()).append("☆☆☆\n");  
  82.                 }  
  83.                   
  84.                 Toast.makeText(getApplicationContext(), info.toString(), Toast.LENGTH_LONG).show();    
  85.             }  
  86.         });  
  87.     }  
  88.   
  89. }  


三、配置文件

打開“AndroidManifest.xml”文件。

然後輸入以下代碼:

 

[html] view plain copy  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.genwoxue.filesax"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="15" />  
  10.     <span style="color:#ff0000;"><strong><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  
  11. </strong></span>  
  12.     <application  
  13.         android:allowBackup="true"  
  14.         android:icon="@drawable/ic_launcher"  
  15.         android:label="@string/app_name"  
  16.         android:theme="@style/AppTheme" >  
  17.         <activity  
  18.             android:name="com.genwoxue.filesax.MainActivity"  
  19.             android:label="@string/app_name" >  
  20.             <intent-filter>  
  21.                 <action android:name="android.intent.action.MAIN" />  
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.     </application>  
  26.   
  27. </manifest>  

注意:由於要進行讀外部存儲卡操作,故而需要在AndroidManifest.xml文件中添加一項權限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

 

四、運行結果

\
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved