频道栏目
首页 > 程序开发 > 移动开发 > Android教程 > Android基础教程 > 正文
第64章、XML文件-XML Pull解析(从零开始学Android)
2016-02-02 11:55:37           
收藏   我要投稿
在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="https://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="https://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" />

四、运行结果

\

点击复制链接 与好友分享!回本站首页
相关TAG标签 文件
上一篇:第63章、XML文件-SAX操作(从零开始学Android)
下一篇:第65章、JSON数据解析(从零开始学Android)
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站