Android XML解析

解析XML有三种方式:Dom、SAX、Pull

其中pull解析器运行方式与SAX类似。

我们首先认识pull解析器:http://developer.android.com/intl/zh-cn/reference/org/xmlpull/v1/XmlPullParser.html

Th following event types are seen by next()

START_TAG
An XML start tag was read.
TEXT
Text content was read; the text content can be retrieved using the getText() method. (when in validating mode next() will not report ignorable whitespace, use nextToken() instead)
END_TAG
An end tag was read
END_DOCUMENT
No more events are available

1.解析
获取解析器: Xml.newPullParser()
设置输入流: parser.setInput(InputStream, String)
获取当前事件类型: parser.getEventType(), 
获取下一个事件类型: parser.next()
获取标签名: parser.getName()
获取属性值: parser.getAttributeValue(int)、getAttributeValue(null,"id")
获取下一个文本: parser.nextText()
2.生成
获取解析器:
设置输出流:
开始文档:
结束文档:
开启标签:
结束标签:
设置属性:
设置文本:

下面我们用一个实例来看看:

在src下面新建presons.xml

Android XML解析
 1 <?xml version=‘1.0‘ encoding=‘UTF-8‘ standalone=‘yes‘ ?>
 2 <persons>
 3     <person id="1">
 4         <name>范冰冰</name>
 5         <age>31</age>
 6     </person>
 7     <person id="2">
 8         <name>林志玲</name>
 9         <age>38</age>
10     </person>
11     <person id="3">
12         <name>杨幂</name>
13         <age>26</age>
14     </person>
15 </persons>
View Code

然后在包中创建Person.java、PersonService.java、PersonTest.java

Android XML解析
 1 public class PersonService {
 2     
 3     public List<Person> loadPersons(InputStream in) throws Exception {
 4         XmlPullParser parser = Xml.newPullParser();        // 获取解析器
 5         parser.setInput(in, "UTF-8");                    // 设置输入流, 指定码表
 6             
 7         ArrayList<Person> persons = new ArrayList<Person>();
 8         Person p = null;
 9         
10         // 最初type赋值为第一个事件, 只要不是文档结束就循环, 每次循环后解析下一个事件
11         for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser.next()) {
12             if (type == XmlPullParser.START_TAG) {                // 如果遇到了标签开始事件
13                 if (parser.getName().equals("person")) {        // 如果标签名为"person"
14                     p = new Person();                            // 创建对象
15                     String id = parser.getAttributeValue(0);    // 获取第一个属性的属性值
16                     p.setId(Integer.parseInt(id));                // 转为int, 设置id
17                     persons.add(p);                                // 装入集合
18                 } else if (parser.getName().equals("name")) {    // 如果标签名为"name"
19                     String name = parser.nextText();            // 获取下一个文本
20                     p.setName(name);                            // 设置name
21                 } else if (parser.getName().equals("age")) {    // 如果标签名为"age"
22                     String age = parser.nextText();                // 获取下一个文本
23                     p.setAge(Integer.parseInt(age));            // 设置age
24                 }
25             } 
26         }
27         
28         return persons;
29     }
30 
31     public void savePersons(List<Person> persons, OutputStream out) throws IOException {
32         XmlSerializer serializer = Xml.newSerializer();        // 获取序列化工具
33         serializer.setOutput(out, "UTF-8");                    // 设置输出流, 指定码表
34         
35         serializer.startDocument("UTF-8", true);    // 开始文档
36         serializer.startTag(null, "persons");        // 开始标签
37         
38         for (Person p : persons) {
39             serializer.startTag(null, "person");
40             serializer.attribute(null, "id", p.getId().toString());        // 设置属性
41             
42             serializer.startTag(null, "name");
43             serializer.text(p.getName());            // 设置文本
44             serializer.endTag(null, "name");
45             
46             serializer.startTag(null, "age");
47             serializer.text(p.getAge().toString());
48             serializer.endTag(null, "age");
49             
50             serializer.endTag(null, "person");
51         }
52         
53         serializer.endTag(null, "persons");            // 结束标签
54         serializer.endDocument();                    // 结束文档
55     }
56 
57 }
View Code
Android XML解析
 1 public class PersonTest extends AndroidTestCase {
 2 
 3     public void testLoad() throws Exception {
 4         PersonService service = new PersonService();
 5         InputStream in = PersonTest.class.getClassLoader().getResourceAsStream("persons.xml");
 6         List<Person> persons = service.loadPersons(in);
 7         for (Person p : persons) 
 8             System.out.println(p);
 9         
10         Person p = new Person(4, "张红", 18);
11         persons.add(p);
12         service.savePersons(persons, new FileOutputStream("/mnt/sdcard/persons.xml"));
13     }
14     
15 }
View Code
Android XML解析
 1 public class Person {
 2     private Integer id;
 3     private String name;
 4     private Integer age;
 5 
 6     public Person() {
 7         super();
 8     }
 9 
10     public Person(Integer id, String name, Integer age) {
11         super();
12         this.id = id;
13         this.name = name;
14         this.age = age;
15     }
16 
17     public Integer getId() {
18         return id;
19     }
20 
21     public void setId(Integer id) {
22         this.id = id;
23     }
24 
25     public String getName() {
26         return name;
27     }
28 
29     public void setName(String name) {
30         this.name = name;
31     }
32 
33     public Integer getAge() {
34         return age;
35     }
36 
37     public void setAge(Integer age) {
38         this.age = age;
39     }
40 
41     @Override
42     public String toString() {
43         return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
44     }
45 
46 }
View Code

然后运行程序,可在日志中看到解析的数据。

(最好添加一个日志信息的过滤器,专门查看System.out输出的信息)

Android XML解析,布布扣,bubuko.com

Android XML解析

上一篇:android4异步任务多次重复执行不调用doInBackground的问题


下一篇:【高德地图API】如何用云图记录生活(旅游app,美食记录,免费停车,通讯录都适用)