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

第64章、XML文件-XML Pull解析(從零開始學Android)

編輯:Android技術基礎

在android系統中,很多資源文件中,很多都是xml格式,在android系統中解析這些xml的方式,是使用pul解析器進行解析的,它和sax解析一樣(個人感覺要比sax簡單點),也是采用事件驅動進行解析的,當pull解析器,開始解析之後,我們可以調用它的next()方法,來獲取下一個解析事件(就是開始文檔,結束文檔,開始標簽,結束標簽),當處於某個元素時可以調用XmlPullParser的getAttributte()方法來獲取屬性的值,也可調用它的nextText()獲取本節點的值。

一、設計界面

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/save"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="保存XML文件(XMLPull)" />  
  13.       
  14.     <Button  
  15.         android:id="@+id/read"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:text="讀取XML文件(XMLPull)" />  
  19.   
  20. </LinearLayout>  


二、程序文件

1、新建“Book.java”文件

[java] view plain copy  
  1. package com.genwoxue.filexmlpull;  
  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、新建“XmlPullSave.java”文件

[java] view plain copy  
  1. package com.genwoxue.filexmlpull;  
  2.   
  3. import java.io.OutputStream;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6. import org.xmlpull.v1.XmlPullParserFactory;  
  7. import org.xmlpull.v1.XmlSerializer;  
  8.   
  9. public class XmlPullSave {  
  10.     private OutputStream ouput=null;  
  11.     private List<Book> books=null;  
  12.     //構造函數  
  13.     public XmlPullSave(OutputStream ouput,List<Book> books){  
  14.         this.ouput=ouput;  
  15.         this.books=books;  
  16.     }  
  17.       
  18.     public void saveBooks() throws Exception{  
  19.   
  20.         //實例化工廠類XmlPullParserFactory     
  21.         XmlPullParserFactory factory=XmlPullParserFactory.newInstance();  
  22.         //創建XmlSerializer實例  
  23.         XmlSerializer xs=factory.newSerializer();  
  24.         xs.setOutput(this.ouput, "UTF-8");  
  25.         xs.startDocument("UTF-8", true);  
  26.         xs.startTag(null, "books");  
  27.         Iterator<Book> iterator=this.books.iterator();  
  28.         while(iterator.hasNext()){  
  29.             Book book=iterator.next();  
  30.             xs.startTag(null, "book");  
  31.             xs.startTag(null, "bookname");  
  32.             xs.text(book.getBookName());  
  33.             xs.endTag(null, "bookname");  
  34.             xs.startTag(null, "author");  
  35.             xs.text(book.getAuthor());  
  36.             xs.endTag(null, "author");  
  37.             xs.startTag(null, "publisher");  
  38.             xs.text(book.getPublisher());  
  39.             xs.endTag(null, "publisher");  
  40.             xs.endTag(null, "book");  
  41.         }  
  42.         xs.endTag(null, "books");  
  43.         xs.endDocument();  
  44.         xs.flush();  
  45.     }  
  46.   
  47. }  


3、新建“XmlPull.java”文件

[java] view plain copy  
  1. package com.genwoxue.filexmlpull;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import org.xmlpull.v1.XmlPullParser;  
  7. import org.xmlpull.v1.XmlPullParserFactory;  
  8.   
  9. public class XmlPull {  
  10.       
  11.     private InputStream input=null;  
  12.       
  13.     //構造函數  
  14.     public XmlPull(InputStream input){  
  15.         this.input=input;  
  16.     }  
  17.   
  18.     public List<Book> getBooks() throws Exception{  
  19.         List<Book> books=null;  
  20.         Book book=null;  
  21.         //創建XmlPullParser,有兩種方式 (本案例采用方式一,方式二可自行嘗試)    
  22.         //方式一:使用工廠類XmlPullParserFactory     
  23.         XmlPullParserFactory factory=XmlPullParserFactory.newInstance();  
  24.         XmlPullParser parser=factory.newPullParser();  
  25.         //方式二:使用Android提供的實用工具類android.util.Xml     
  26.         //XmlPullParser parser = Xml.newPullParser();     
  27.         parser.setInput(this.input,"UTF-8");  
  28.         int eventType=parser.getEventType();        //獲取事件代碼  
  29.         while(eventType!=XmlPullParser.END_DOCUMENT){  
  30.             switch(eventType){  
  31.             case XmlPullParser.START_DOCUMENT:  //判斷當前事件是否是文檔開始事件  
  32.                 books=new ArrayList<Book>();  //初始化books集合  
  33.                 break;  
  34.             case XmlPullParser.START_TAG:       //判斷當前事件是否是標簽元素開始事件  
  35.                 if("book".equals(parser.getName())) //判斷開始標簽元素是否是book     
  36.                     book=new Book();                //初始化book對象  
  37.                 if(book!=null){  
  38.                     if("bookname".equals(parser.getName()))     //判斷標簽元素是否是bookname   
  39.                         book.setBookName(parser.nextText());    //parser.nextText()獲取bookname元素後文本  
  40.                     else if("author".equals(parser.getName()))  
  41.                         book.setAuthor(parser.nextText());  
  42.                     else if("publisher".equals(parser.getName()))  
  43.                         book.setPublisher(parser.nextText());  
  44.                 }  
  45.                 break;  
  46.             case XmlPullParser.END_TAG:                 //判斷當前事件是否是標簽元素結束事件  
  47.                 if("book".equals(parser.getName())){    //判斷開始標簽元素是否是book  
  48.                     books.add(book);                    //將book對像添加到books列表  
  49.                     book=null;                          //book清空  
  50.                 }  
  51.                 break;  
  52.             }  
  53.             eventType=parser.next();                    //獲取下一個事件代碼  
  54.         }  
  55.         return books;                                   //返回books列表  
  56.     }  
  57. }  


4、打開“src/com.genwoxue.filesax/MainActivity.java”文件。
然後輸入以下代碼:

[java] view plain copy  
  1. package com.genwoxue.filexmlpull;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.OutputStream;  
  10. import java.util.ArrayList;  
  11. import java.util.List;  
  12. import android.os.Bundle;  
  13. import android.os.Environment;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.Toast;  
  18. import android.app.Activity;  
  19.   
  20. public class MainActivity extends Activity {  
  21.   
  22.     private Button btnSave=null;  
  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.         btnSave=(Button)super.findViewById(R.id.save);  
  33.         btnRead=(Button)super.findViewById(R.id.read);  
  34.           
  35.         btnSave.setOnClickListener(new OnClickListener(){  
  36.             public void onClick(View v)  
  37.             {    
  38.                 OutputStream output=null;  
  39.                 XmlPullSave xmlPullSave=null;  
  40.                 //判斷外部存儲卡是否存在  
  41.                 if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  42.                     Toast.makeText(getApplicationContext(), "讀取失敗,SD存儲卡不存在!", Toast.LENGTH_LONG).show();    
  43.                     return;  
  44.                 }  
  45.                   
  46.                 //初始化File  
  47.                 String path=Environment.getExternalStorageDirectory().toString()  
  48.                         +File.separator  
  49.                         +"genwoxue"  
  50.                         +File.separator  
  51.                         +FILENAME;  
  52.                 file=new File(path);  
  53.                   
  54.                 //如果當前文件的父文件夾不存在,則創建genwoxue文件夾  
  55.                 if(!file.getParentFile().exists())  
  56.                     file.getParentFile().mkdirs();  
  57.   
  58.                 //初始化books  
  59.                 List<Book> books=new ArrayList<Book>();  
  60.                 Book book=new Book();  
  61.                 book.setBookName("跟我學Android");  
  62.                 book.setAuthor("蔣老夫子");  
  63.                 book.setPublisher("人民郵電出版社");  
  64.                 books.add(book);  
  65.                 book=null;  
  66.                 book=new Book();  
  67.                 book.setBookName("從零開始學Android");  
  68.                 book.setAuthor("蔣老夫子");  
  69.                 book.setPublisher("清華大學出版社");  
  70.                 books.add(book);  
  71.                 book=null;  
  72.                   
  73.                 //保存XML文件  
  74.                 try {  
  75.                     output=new FileOutputStream(file);  
  76.                     xmlPullSave=new XmlPullSave(output,books);  //初始化XmlPullSave  
  77.                     try {  
  78.                         xmlPullSave.saveBooks();                //saveBooks保存至XML文件  
  79.                     } catch (Exception e) {  
  80.                         e.printStackTrace();  
  81.                     }  
  82.                 } catch (FileNotFoundException e) {  
  83.                     e.printStackTrace();  
  84.                 }finally{  
  85.                     if(output!=null)  
  86.                         try {  
  87.                             output.close();  
  88.                             books.clear();  
  89.                         } catch (IOException e) {  
  90.                             e.printStackTrace();  
  91.                         }  
  92.                 }  
  93.             }  
  94.         });  
  95.           
  96.         btnRead.setOnClickListener(new OnClickListener(){  
  97.             public void onClick(View v)  
  98.             {    
  99.                 info=new StringBuffer();  
  100.                 //判斷外部存儲卡是否存在  
  101.                 if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  102.                     Toast.makeText(getApplicationContext(), "讀取失敗,SD存儲卡不存在!", Toast.LENGTH_LONG).show();    
  103.                     return;  
  104.                 }  
  105.                 //判斷文件是否存在  
  106.                 String path=Environment.getExternalStorageDirectory().toString()  
  107.                         +File.separator  
  108.                         +"genwoxue"  
  109.                         +File.separator  
  110.                         +FILENAME;  
  111.                 file=new File(path);  
  112.                   
  113.                 if(!file.exists()){  
  114.                     Toast.makeText(getApplicationContext(), "XML文件不存在!", Toast.LENGTH_LONG).show();    
  115.                     return;  
  116.                 }  
  117.                   
  118.                 //解析XML文件  
  119.                 try {  
  120.                     InputStream input=new FileInputStream(file);  
  121.                     XmlPull pull=new XmlPull(input);  
  122.                     List<Book> list=pull.getBooks();  
  123.                       
  124.                     //遍歷列表,獲取書籍信息  
  125.                     for(int pos=0;pos<list.size();pos++){  
  126.                         info.append(list.get(pos).getBookName()).append("☆☆☆");  
  127.                         info.append(list.get(pos).getAuthor()).append("☆☆☆");  
  128.                         info.append(list.get(pos).getPublisher()).append("☆☆☆");  
  129.                     }  
  130.                 }catch(Exception e){  
  131.                     e.printStackTrace();  
  132.                 }  
  133.                   
  134.                 Toast.makeText(getApplicationContext(), info.toString(), Toast.LENGTH_LONG).show();    
  135.             }  
  136.         });  
  137.     }  
  138. }  
  139. <p></p><p><strong></strong>  
  140.  </p>  

三、配置文件

打開“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.filexmlpull"  
  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.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/></strong>  
  12. </span>  
  13.     <application  
  14.         android:allowBackup="true"  
  15.         android:icon="@drawable/ic_launcher"  
  16.         android:label="@string/app_name"  
  17.         android:theme="@style/AppTheme" >  
  18.         <activity  
  19.             android:name="com.genwoxue.filexmlpull.MainActivity"  
  20.             android:label="@string/app_name" >  
  21.             <intent-filter>  
  22.                 <action android:name="android.intent.action.MAIN" />  
  23.                 <category android:name="android.intent.category.LAUNCHER" />  
  24.             </intent-filter>  
  25.         </activity>  
  26.     </application>  
  27.   
  28. </manifest>  

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

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

四、運行結果

\

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