罗敬威的博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  Pull是Android内置的xml解析器。XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和 Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。 但Xmlpull比Sax更简明,而且不需要扫描完整个流。

  一、生成Xml文件

 1 /**
 2      * 写Xml文件到本地
 3      */
 4     private void serializerToLocal(){
 5         // 获取数据
 6         List<Person> personList = getPersonList();
 7         
 8         // 获得序列化对象
 9         XmlSerializer serializer = Xml.newSerializer();
10         
11         // 写到SDCard
12         File path = new File(Environment.getExternalStorageDirectory(),"persons.xml");
13         try {
14             FileOutputStream fos = new FileOutputStream(path);
15             // 指定序列化对象输出的位置和编码
16             serializer.setOutput(fos, "utf-8");
17             
18             serializer.startDocument("utf-8", true); //    <?xml version="1.0" encoding="utf-8"?>
19             
20             serializer.startTag(null, "persons");    //    <persons>
21             
22             for(Person person : personList){
23                 // 开始写人
24                 serializer.startTag(null, "person");    //    <person>
25                 
26                 serializer.attribute(null, "id", String.valueOf(person.getId()));// 设置id属性
27                 
28                 // 写名字
29                 serializer.startTag(null, "name");    //    <name>
30                 serializer.text(person.getName());
31                 serializer.endTag(null, "name");    //    </name>
32                 
33                 // 写年龄
34                 serializer.startTag(null, "age");    //    <age>
35                 serializer.text(String.valueOf(person.getAge()));
36                 serializer.endTag(null, "age");    //    </age>
37                 
38                 serializer.endTag(null, "person");        //</person>
39             }
40             
41             serializer.endTag(null, "persons");    //    </persons>
42             
43             serializer.endDocument();    // 结束
44             
45         } catch (Exception e) {
46             e.printStackTrace();
47         }
48     }
49     
50     /**
51      * 获取数据
52      * @return 要转成xml数据的集合
53      */
54     private List<Person> getPersonList(){
55         List<Person> personList = new ArrayList<Person>();
56         
57         for(int i=0;i<5;i++){
58             personList.add(new Person(i, 18+i, "zhang"+i));
59         }
60         return personList;
61         
62     }

上述代码中所用到的PersonBean:

 1 public class Person {
 2     
 3     private int id;
 4     private int age;
 5     private String name;
 6     public Person() {
 7         super();
 8         // TODO Auto-generated constructor stub
 9     }
10     public Person(int id, int age, String name) {
11         super();
12         this.id = id;
13         this.age = age;
14         this.name = name;
15     }
16     @Override
17     public String toString() {
18         return "Person [id=" + id + ", age=" + age + ", name=" + name + "]";
19     }
20     public int getId() {
21         return id;
22     }
23     public void setId(int id) {
24         this.id = id;
25     }
26     public int getAge() {
27         return age;
28     }
29     public void setAge(int age) {
30         this.age = age;
31     }
32     public String getName() {
33         return name;
34     }
35     public void setName(String name) {
36         this.name = name;
37     }
38     
39     
40     
41 }

生成的xml文件:

 1 <?xml version='1.0' encoding='utf-8' standalone='yes'?>
 2 <persons>
 3 
 4     <person id="0" >
 5         <name>zhang0</name>
 6         <age>18</age>
 7     </person>
 8 
 9     <person id="1" >
10 
11         <name>zhang1</name>
12         <age>19</age>
13         
14     </person>
15 
16     <person id="2" >
17 
18         <name>zhang2</name>
19         <age>20</age>
20         
21     </person>
22 
23     <person id="3" >
24 
25         <name>zhang3</name>
26         <age>21</age>
27         
28     </person>
29 
30     <person id="4" >
31 
32         <name>zhang4</name>
33         <age>22</age>
34         
35     </person>
36 
37 </persons>

二、使用pull解析Xml文件

 1 /**
 2      * 解析xml文件
 3      * @return 返回组成的list
 4      */
 5     private List<Person> parseXmlFromLocal(){
 6         File path = new File(Environment.getExternalStorageDirectory(),"persons.xml");
 7         try {
 8             FileInputStream fis = new FileInputStream(path);
 9             // 获得解析器对象parser
10             XmlPullParser parser = Xml.newPullParser();
11             
12             parser.setInput(fis, "utf-8");
13             
14             int eventType = parser.getEventType();    // 获得事件类型
15             List<Person> personList = null;
16             Person p = null;
17             while(eventType != XmlPullParser.END_DOCUMENT){
18                 String tagName = parser.getName();    // 获得当前节点的名称
19                 switch (eventType) {
20                 case XmlPullParser.START_TAG:    //    当前为开始节点    可以是<person>也可以是<persons>
21                     if("persons".equals(tagName)){        //    <persons>
22                         // 创建List集合
23                         personList = new ArrayList<Person>();
24                     }else if("person".equals(tagName)){        //    <person id="1">
25                         // 创建Person对象
26                         p = new Person();
27                         String id = parser.getAttributeValue(null, "id");
28                         p.setId(Integer.parseInt(id));
29                     }else if("name".equals(tagName)){
30                         String name = parser.nextText(); // 标签之间的值
31                         p.setName(name);
32                     }else if("age".equals(tagName)){
33                         String age = parser.nextText();
34                         p.setAge(Integer.parseInt(age));
35                     }
36                     break;
37                     
38                 case XmlPullParser.END_TAG: // 结束元素事件
39                     if("person".equals(tagName)){
40                         // 结束
41                         // 把上面设置好的值添加到List集合中
42                         personList.add(p);
43                     }
44                     break;
45 
46                 default:
47                     break;
48                 }
49                 
50                 eventType = parser.next();    // 获得下一个事件类型
51             }
52             return personList;
53         } catch (Exception e) {
54             e.printStackTrace();
55         }
56         return null;
57     }

打印出得到的List集合的数据:

1 List<Person> personList = parseXmlFromLocal();
2         for(Person person : personList){
3             Log.i("person.xml", person.toString());
4             
5         }

 

    

posted on 2015-05-19 12:53  luojinwei  阅读(207)  评论(0编辑  收藏  举报