Android解析XML(PULL方式)

来源:互联网 发布:powerdesigner sql 编辑:程序博客网 时间:2024/05/09 05:40

PULL 的工作原理:

XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parsernextTextXML文档中提取所有字符数据。当解析到一个文档结束时,自动生成EndDocument事件。

常用的XML pull的接口和类:

XmlPullParser该解析器是一个在org.xmlpull.v1中定义的解析功能的接口。

XmlSerializer它是一个接口,定义了XML信息集的序列。

XmlPullParserFactory这个类用于在XMPULL V1 API中创建XML Pull解析器。

XmlPullParserException抛出单一的XML pull解析器相关的错误。

PULL解析器的运行方式和SAX类似,都是基于事件的模式。

不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码:

读取到xml声明返回 START_DOCUMENT; 结束返回 END_DOCUMENT ; 开始标签返回 START_TAG;

结束标签返回 END_TAG; 文本返回 TEXT。


发个图先:



Book.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <books>  
  3.     <book>  
  4.         <id>1</id>  
  5.         <name>Android开发范例大全(第一版)</name>  
  6.         <price>69.00</price>  
  7.     </book>  
  8.     <book>  
  9.         <id>2</id>  
  10.         <name>Android开发范例大全(第二版)</name>  
  11.         <price>79.00</price>  
  12.     </book>  
  13.     <book>  
  14.         <id>3</id>  
  15.         <name>Android开发范例大全(第三版)</name>  
  16.         <price>89.00</price>  
  17.     </book>  
  18. </books>    



Book.java

[java] view plaincopy
  1. public class Book {  
  2.   
  3.     private int id;  
  4.     private String name;  
  5.     private float price;  
  6.   
  7.     public int getId() {  
  8.         return id;  
  9.     }  
  10.   
  11.     public void setId(int id) {  
  12.         this.id = id;  
  13.     }  
  14.   
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.   
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.   
  23.     public float getPrice() {  
  24.         return price;  
  25.     }  
  26.   
  27.     public void setPrice(float price) {  
  28.         this.price = price;  
  29.     }  
[java] view plaincopy
  1. }  


PullXmlActivity.java


[java] view plaincopy
  1. public class PullXmlActivity extends Activity{  
  2.     private List<Book> list=null;  
  3.     private PullXmlAdapter adapter;  
  4.     private ListView lv;  
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         // TODO Auto-generated method stub  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.listview);  
  10.         lv=(ListView)findViewById(R.id.listView);  
  11.         InputStream in;  
  12.         try {  
  13.             in = this.getAssets().open("books.xml");  
  14.               
  15.             list=pullxml(in);  
  16.               
  17.         } catch (IOException e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.         } catch (Exception e) {  
  21.             // TODO Auto-generated catch block  
  22.             e.printStackTrace();  
  23.         }  
  24.         adapter=new PullXmlAdapter(PullXmlActivity.this, list);   
  25.         lv.setAdapter(adapter);  
  26.     }  
  27.     /**xml文件的获取 
  28.      * 1.xml文件放在res的xml文件夹下(推荐)使用XmlResourceParser xmlParser = this.getResources().getXml(R.xml.XXX); 
  29.      * 2.xml文件放在raw的xml文件夹下使用InputStream inputStream =this.getResources().openRawResource(R.raw.XXX);  
  30.      * 3.xml文件放在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:<?xml version="1.0" encoding="utf-8"?>, 
  31.      * 否则解析报错,具体原因未查明:InputStream inputStream = getResources().getAssets().open(fileName); 
  32.      * 4.xml文件放在SD卡, path路径根据实际项目修改,此次获取SDcard根目录:    
  33.      * String path = Environment.getExternalStorageDirectory().toString();   
  34.      * File xmlFlie = new File(path+fileName);   
  35.      * InputStream inputStream = new FileInputStream(xmlFlie);   
  36.      */  
  37.     public List<Book> pullxml(InputStream in)throws Exception{  
  38.         List<Book> list=null;  
  39.         Book book = null;  
  40.             // 由android.util.Xml创建一个XmlPullParser实例  
  41.             XmlPullParser parser = Xml.newPullParser();  
  42.             // 设置输入流 并指明编码方式  
  43.                parser.setInput(in, "UTF-8");  
  44.             // 产生第一个事件  
  45.                int eventType = parser.getEventType();  
  46.                  
  47.                while (eventType != XmlPullParser.END_DOCUMENT) {  
  48.                    switch (eventType) {  
  49.                 // 判断当前事件是否为文档开始事件  
  50.                    case XmlPullParser.START_DOCUMENT:  
  51.                        list=new ArrayList<Book>();// 初始化list集合  
  52.                        break;  
  53.                     // 判断当前事件是否为标签元素开始事件  
  54.                    case XmlPullParser.START_TAG:  
  55.                        if (parser.getName().equals("book")) { // 判断开始标签元素是否是book  
  56.                            book = new Book();  
  57.                        } else if (parser.getName().equals("id")) {  
  58.                            eventType = parser.next();  
  59.                            // 得到book标签的属性值,并设置book的id  
  60.                             book.setId(Integer.parseInt(parser.getText()));  
  61.                         } else if (parser.getName().equals("name")) { // 判断开始标签元素是否是book  
  62.                              eventType = parser.next();  
  63.                              book.setName(parser.getText());  
  64.                         } else if (parser.getName().equals("price")) { // 判断开始标签元素是否是price  
  65.                             eventType = parser.next();  
  66.                              book.setPrice(Float.parseFloat(parser.getText()));  
  67.                         }  
  68.                        break;  
  69.                     // 判断当前事件是否为标签元素结束事件  
  70.                    case XmlPullParser.END_TAG:  
  71.                        if (parser.getName().equals("book")) { // 判断结束标签元素是否是book  
  72.                            list.add(book); // 将book添加到books集合  
  73.                            book = null;  
  74.                        }  
  75.                        break;  
  76.                    }  
  77.                    // 进入下一个元素并触发相应事件  
  78.                    eventType = parser.next();  
  79.                }  
  80.                return list;  
  81.     }  
  82. }  

PullXmlAdapter.java


[java] view plaincopy
  1. public class PullXmlAdapter extends BaseAdapter {  
  2.     private List<Book> list=null;  
  3.     private Context context=null;  
  4.     private LayoutInflater inflater=null;  
  5.       
  6. public PullXmlAdapter(Context context,List<Book> list) {  
  7.     // TODO Auto-generated constructor stub  
  8.     this.context=context;  
  9.     this.list=list;  
  10. }  
  11.     @Override  
  12.     public int getCount() {  
  13.         // TODO Auto-generated method stub  
  14.         return list.size();  
  15.     }  
  16.   
  17.     @Override  
  18.     public Object getItem(int arg0) {  
  19.         // TODO Auto-generated method stub  
  20.         return arg0;  
  21.     }  
  22.   
  23.     @Override  
  24.     public long getItemId(int arg0) {  
  25.         // TODO Auto-generated method stub  
  26.         return arg0;  
  27.     }  
  28.   
  29.     @Override  
  30.     public View getView(int arg0, View arg1, ViewGroup arg2) {  
  31.         // TODO Auto-generated method stub  
  32.         inflater=LayoutInflater.from(context);  
  33.         View v=inflater.inflate(R.layout.listview_item, null);  
  34.         TextView tv=(TextView)v.findViewById(R.id.lisview_item_tv);  
  35.         tv.setText(list.get(arg0).getName());  
  36.         return v;  
  37.     }  
  38.   

在此鸣谢该博主:http://blog.csdn.net/onlyonecoder/article/details/8489170