Android开发:PULL方式解析XML


Android中解析XML的方式有三种,DOM方式是将全部文件解析到内存中,再进行操作,对于手机来说太耗内存了;SAX和PULL都采用事件驱动的方式,边读边解析。在看过几种之后觉得PULL比较好记。以下是摘录的代码:
  1. import java.io.InputStream;  
  2. import java.io.OutputStream;  
  3. import java.io.Writer;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7.   
  8. import org.xmlpull.v1.XmlPullParser;  
  9. import org.xmlpull.v1.XmlSerializer;  
  10.   
  11.   
  12. import android.util.Xml;  
  13.   
  14.   
  15. import cn.itcast.domain.Person;  
  16. /** 
  17.  * 采用Pull解析XML内容 
  18.  */  
  19. public class PULLPersonService {  
  20.   
  21. public static void save(List<Person> persons, Writer writer) throws Throwable{  
  22. XmlSerializer serializer = Xml.newSerializer();  
  23. serializer.setOutput(writer);  
  24. serializer.startDocument("UTF-8"true);  
  25.   
  26. serializer.startTag(null"persons");  
  27. for(Person person : persons){  
  28. serializer.startTag(null"person");  
  29. serializer.attribute(null"id", person.getId().toString());  
  30.   
  31. serializer.startTag(null"name");  
  32. serializer.text(person.getName());  
  33. serializer.endTag(null"name");  
  34.   
  35. serializer.startTag(null"age");  
  36. serializer.text(person.getAge().toString());  
  37. serializer.endTag(null"age");  
  38.   
  39. serializer.endTag(null"person");  
  40. }  
  41. serializer.endTag(null"persons");  
  42. serializer.endDocument();  
  43. writer.flush();  
  44. writer.close();  
  45. }  
  46.   
  47.   
  48. public static List<Person> getPersons(InputStream inStream) throws Throwable{  
  49. List<Person> persons = null;  
  50. Person person = null;  
  51. XmlPullParser parser = Xml.newPullParser();  
  52. parser.setInput(inStream, "UTF-8");  
  53. int eventType = parser.getEventType();//产生第一个事件   
  54. while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件   
  55. switch (eventType) {  
  56. case XmlPullParser.START_DOCUMENT://如果是   
  57. persons = new ArrayList<Person>();  
  58. break;  
  59.   
  60. case XmlPullParser.START_TAG:  
  61. String name = parser.getName();//获取解析器当前指向的元素的名称   
  62. if("person".equals(name)){  
  63. person = new Person();  
  64. person.setId(new Integer(parser.getAttributeValue(0)));  
  65. }  
  66. if(person!=null){  
  67. if("name".equals(name)){  
  68. person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值   
  69. }  
  70. if("age".equals(name)){  
  71. person.setAge(new Short(parser.nextText()));  
  72. }  
  73. }  
  74. break;  
  75.   
  76. case XmlPullParser.END_TAG:  
  77. if("person".equals(parser.getName())){  
  78. persons.add(person);  
  79. person = null;  
  80. }  
  81. break;  
  82. }  
  83. eventType = parser.next();  
  84. }  
  85. return persons;  
  86. }  
  87. }  

相关内容