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 }