解析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
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>
然后在包中创建Person.java、PersonService.java、PersonTest.java
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 }
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 }
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 }
然后运行程序,可在日志中看到解析的数据。
(最好添加一个日志信息的过滤器,专门查看System.out输出的信息)