Android解析XML(PULL方式)

PULL 的工作原理:

XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据。当解析到一个文档结束时,自动生成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(xml文件)

 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(实体类)

 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     }
30 }

PullXmlActivity.java(Activity)

 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 (适配器)

 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
39 }

最后显示结果:

时间: 2024-11-08 21:43:25

Android解析XML(PULL方式)的相关文章

android解析XML总结-SAX、Pull、Dom三种方式

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id="0&q

(五十七)android解析XML总结(SAX、Pull、Dom三种方式)

一.SAX.DOM.PULL的比较 SAX.DOM.PULL各有自己的特点,具体操作XML的时候该如何选择呢? 1.内存占用 这是一个根本性问题.由于Android手机性能相对于现在的应用操作还是有限的,程序对内存的占用直接影响到了解析XML的速度.在这点上,SAX.Pull以它们比DOM占用更少的内存的解析方式,更适合于Android手机开发. 2.编程方式 SAX采用事件驱动,在相应事件触发的时候,会调用用户编写好的方法.也就是说,每解析一类XML,就要编写一个新的适合该类XML的处理类.这

详解android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了android解析Xml的三种方式——DOM.SAX以及XMLpull,这里对它们进行总结. 如果理解有误,欢迎指正   ^_* 一.DOM方式解析: xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据.这个写起来很简单,但是很消耗内存.要是数据过大,手机不够牛逼,可能手机直接死机. 常用的DoM接口和类: Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础.Element:该接口继承Node接口,提供了获

java和android的解析xml的方式

java解析xml经典的有四种方式: 1.dom 2.sax 3.jdom 4.dom4j   个人觉得dom4j好用,但是我只用过jdom. android我知道的用两种方式,sax和pull SAX方式的特点是需要解析完整个文档才会返回,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式还是会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源. Pull解析器和SAX解析器虽有区别但也有相似性.他们的区别为:SAX解析器的

Android -- 解析xml

简单布局                                                                                      <TextView android:id="@+id/tv_weather" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_cente

Android中使用PULL方式解析XML文件

Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理.当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值. 下面我们通过Demo例子来介绍如何使用PULL机制来解析XML文件.先看下如下工程的目录结构: 按以下步骤进行操作: [1]

[android]解析XML文件的方法有三种:PULL,DOM,SAM

PULL 的工作原理: XML pull提供了开始元素和结束元素.当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据.当解析到一个文档结束时,自动生成EndDocument事件. 常用的XML pull的接口和类: XmlPullParser:该解析器是一个在org.xmlpull.v1中定义的解析功能的接口. XmlSerializer:它是一个接口,定义了XML信息集的序列. XmlPullParserFactory:这个类用于在XMPULL V1 API

android 解析XML方式(一)

在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xml,xml是与平台无关的特性,被广泛运用于数据通信中,那么在android中如何解析xml文件数据呢? 通常有三种方式:DOM,SAX,PULL 在这一节中我们使用DOM方式来处理. DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大呢?手机CPU处理能力当然不能与PC机器比,因此在处理效率方面就相对差了,当然这是对

android 解析XML方式(三)

上一节中,我们使用SAX方式解析xml文档, SAX方式是基于事件驱动的.当然android的事件机制是基于回调函数的.在这一节中,我们用另外一种方式解析xml文档,这种方式也是基于事件驱动的,与SAX方式一样,它就是PULL方式.只不过PULL方式读xml回调方法返回的是数字. 读取到xml的声明返回      START_DOCUMENT;    读取到xml的结束返回       END_DOCUMENT ;    读取到xml的开始标签返回 START_TAG    读取到xml的结束标