XML的解析和序列化

  1 public class Test extends TestCase {
  2 
  3     public void test() throws IllegalStateException, RuntimeException, IOException {
  4         writeXMLTOLocal();
  5         
  6         List<Person> personList = parserXmlFromLocal();
  7         
  8         for (Person person : personList) {
  9             Log.i("TestCase", person.toString());
 10         }
 11     }
 12 
 13     public void writeXMLTOLocal() throws RuntimeException,
 14             IllegalStateException, IOException {
 15         List<Person> personlist = getPersondList();
 16         // 获得序列化对象
 17         XmlSerializer serializer = Xml.newSerializer();
 18 
 19         File path = new File(Environment.getExternalStorageDirectory(),
 20                 "person.xml");
 21         FileOutputStream fos;
 22         try {
 23             fos = new FileOutputStream(path);
 24             serializer.setOutput(fos, "utf-8");
 25 
 26             serializer.startDocument("utf-8", true);
 27             serializer.startTag(null, "persons");
 28 
 29             for (Person person : personlist) {
 30                 serializer.startTag(null, "person");
 31                 serializer.attribute(null, "id", String.valueOf(person.getId()));
 32 
 33                 serializer.startTag(null, "name");
 34                 serializer.text(person.getName());
 35                 serializer.endTag(null, "name");
 36 
 37                 // 写年龄
 38                 serializer.startTag(null, "age"); // <age>
 39                 serializer.text(String.valueOf(person.getAge()));
 40                 serializer.endTag(null, "age"); // </age>
 41 
 42                 serializer.endTag(null, "person"); // </person>
 43             }
 44 
 45             serializer.endTag(null, "persons"); // </persons>
 46 
 47             serializer.endDocument(); // 结束
 48         } catch (FileNotFoundException e) {
 49             // TODO Auto-generated catch block
 50             e.printStackTrace();
 51         }
 52 
 53     }
 54     
 55     private List<Person> parserXmlFromLocal() {
 56         try {
 57             File path = new File(Environment.getExternalStorageDirectory(), "person.xml");
 58             FileInputStream fis = new FileInputStream(path);
 59             
 60             // 获得pull解析器对象
 61             XmlPullParser parser = Xml.newPullParser();
 62             // 指定解析的文件和编码格式
 63             parser.setInput(fis, "utf-8");
 64             
 65             int eventType = parser.getEventType();         // 获得事件类型
 66             
 67             List<Person> personList = null;
 68             Person person = null;
 69             String id;
 70             while(eventType != XmlPullParser.END_DOCUMENT) {
 71                 String tagName = parser.getName();    // 获得当前节点的名称
 72                 
 73                 switch (eventType) {
 74                 case XmlPullParser.START_TAG:         // 当前等于开始节点  <person>
 75                     if("persons".equals(tagName)) {    // <persons>
 76                         personList = new ArrayList<Person>();
 77                     } else if("person".equals(tagName)) { // <person >
 78                         person = new Person();
 79                         id = parser.getAttributeValue(null, "id");
 80                         person.setId(Integer.valueOf(id));
 81                     } else if("name".equals(tagName)) { // <name>
 82                         person.setName(parser.nextText());
 83                     } else if("age".equals(tagName)) { // <age>
 84                         person.setAge(Integer.parseInt(parser.nextText()));
 85                     }
 86                     break;
 87                 case XmlPullParser.END_TAG:        // </persons>
 88                     if("person".equals(tagName)) {
 89                         // 需要把上面设置好值的person对象添加到集合中
 90                         personList.add(person);
 91                     }
 92                     break;
 93                 default:
 94                     break;
 95                 }
 96                 
 97                 eventType = parser.next();        // 获得下一个事件类型
 98             }
 99             return personList;
100         } catch (Exception e) {
101             e.printStackTrace();
102         }
103         return null;
104     }
105     private List<Person> getPersondList() {
106         List<Person> personlist = new ArrayList<Person>();
107         for (int i = 0; i < 30; i++) {
108             personlist.add(new Person(i, "wang" + i, 18 + i));
109         }
110 
111         return personlist;
112     }
113 
114 }