Android解析XML有SAX、DOM、Pull等几种方式,今天就简单写写Pull方式解析xml。
Pull内置于Android系统中,是官方解析布局文件所使用的方式。Pull和Sax类似,都是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。
它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。、
Android系统中和Pull方式相关的包为org.xmlpull.v1.
经常需要使用的类:
XmlPullParserFactory 工厂类,用来创建pull解析器
XmlPullParser pull解析器
XmlPullParserException 异常
Pull内置于Android系统中,是官方解析布局文件所使用的方式。Pull和Sax类似,都是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。
它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。、
Android系统中和Pull方式相关的包为org.xmlpull.v1.
经常需要使用的类:
XmlPullParserFactory 工厂类,用来创建pull解析器
XmlPullParser pull解析器
XmlPullParserException 异常
XmlSerializer 该类用来将指定的对象转化为XML文档
要解析的xml如下:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>张三</name> <age>33</age> </person> <person id="2"> <name>李四</name> <age>44</age> </person> <person id="3"> <name>周五</name> <age>55</age> </person> <person id="4"> <name>王六</name> <age>66</age> </person> </persons>
解析xml的方法:
/** * 解析XML * @param inputStream * @return * @throws Exception */ private static List<Person> getXml(InputStream inputStream) throws Exception{ Person person = null; List<Person> persons =null; XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(inputStream, "utf-8"); int event = pullParser.getEventType(); //触发第一个事件 while (event != XmlPullParser.END_DOCUMENT){ switch (event){ case XmlPullParser.START_DOCUMENT: persons = new ArrayList<>(); break; case XmlPullParser.START_TAG: if("person".equals(pullParser.getName())){ int id = new Integer(pullParser.getAttributeValue(0)); person = new Person(); person.setId(id); } if(person != null){ if("name".equals(pullParser.getName())){ person.setName(pullParser.nextText()); } if("age".equals(pullParser.getName())){ person.setAge(new Short(pullParser.nextText())); } } break; case XmlPullParser.END_TAG: if("person".equals(pullParser.getName())) { persons.add(person); person = null; } break; } event = pullParser.next(); } return persons; }
生成xml的方法:
/** * 生成xml * @param persons * @param outputStream * @throws Exception */ private void putXml(List<Person> persons, OutputStream outputStream) throws Exception{ XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(outputStream, "utf-8"); serializer.startDocument("utf-8", true); serializer.startTag(null, "persons"); for(Person person : persons){ serializer.startTag(null, "person"); serializer.attribute(null, "id", String.valueOf(person.getId())); serializer.startTag(null, "name"); serializer.text(person.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(String.valueOf(person.getAge())); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); outputStream.flush(); outputStream.close(); }
开始读取xml的内容:
try { List<Person> persons = getXml(getAssets().open("persons.xml")); for(int i = 0; i<persons.size(); i++){ Person person = persons.get(i); tv.append("id:"+person.getId()+" name:"+person.getName()+" age:"+person.getAge()+"\n"); } }catch (Exception e){ e.printStackTrace(); }结果是:
开始生成xml:
File file = new File(Environment.getExternalStorageDirectory(), "persons.xml"); try{ FileOutputStream outputStream = new FileOutputStream(file); putXml(getXml(getAssets().open("persons.xml")), outputStream); }catch (Exception e){ e.printStackTrace(); }
可以看到在sd卡的文件里多了一个persons.xml文件: