Android下使用pull解析器生成XML文件、读取XML文件
Android下使用Pull解析器 1,Pull解析器的执行方式与SAX解析器类似。它提供了类似的事件。如:開始元素和结束元素事件。
2,使用parser.next()能够进入下一个元素并触发对应事件。
3,事件将作为一个int数值被发送,因此能够使用一个switch对对应的事件进行处理。 4,当元素開始解析时,调用parser.nextText()方法能够获取下一个Text类型节点的值。 5,相关API: 获得当前节点事件类型:parser.getEventType(); 获得下一节点事件类型:parser.next(); 获取标签名: parser.getName() 获得标签属性值: parser.getAttributeValue(); 获得下一个Text类型节点的值:parser.nextText(); 样例: <?xml version="1.0" encoding="UTF-8"?
> <persons> <person id=“18"> <name>allen</name> <age>36</age> </person> <person id=“28"> <name>james</name> <age>25</age> </person> </persons> // 使用Pull解析器生成XML文件。并写到本地 private void writeXmlToLocal() { List<Person> personList = getPersonList(); // 获得序列化对象 XmlSerializer serializer = Xml.newSerializer(); // XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer(); try { File path = new File(Environment.getExternalStorageDirectory(), "persons.xml"); FileOutputStream fos = new FileOutputStream(path); // 指定序列化对象输出的位置和编码 serializer.setOutput(fos, "utf-8"); // 写開始 <?
xml version='1.0' encoding='utf-8' standalone='yes' ?
> serializer.startDocument("utf-8", true); serializer.startTag(null, "persons"); // <persons> for (Person person : personList) { // 開始写person serializer.startTag(null, "person"); // <person> serializer.attribute(null, "id", String.valueOf(person.getId())); // 写person的name serializer.startTag(null, "name"); // <name> serializer.text(person.getName()); serializer.endTag(null, "name"); // </name> // 写person的age serializer.startTag(null, "age"); // <age> serializer.text(String.valueOf(person.getAge())); serializer.endTag(null, "age"); // </age> serializer.endTag(null, "person"); // </person> } serializer.endTag(null, "persons"); // </persons> serializer.endDocument(); // 结束 } catch (Exception e) { e.printStackTrace(); } } // 使用Pull解析器读取本地的XML文件 private List<Person> parserXmlFromLocal() { try { File path = new File(Environment.getExternalStorageDirectory(), "persons.xml"); FileInputStream fis = new FileInputStream(path); // 获得pull解析器对象 XmlPullParser parser = Xml.newPullParser(); // XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); // 指定解析的文件和编码格式 parser.setInput(fis, "utf-8"); // 获得事件类型 int eventType = parser.getEventType(); List<Person> personList = null; Person person = null; String id; while(eventType != XmlPullParser.END_DOCUMENT) { // 获得当前节点的名称 String tagName = parser.getName(); switch (eventType) { case XmlPullParser.START_TAG: // 当前等于開始节点 <person> if("persons".equals(tagName)) { // <persons> personList = new ArrayList<Person>(); } else if("person".equals(tagName)) { // <person id="1"> person = new Person(); id = parser.getAttributeValue(null, "id"); person.setId(Integer.valueOf(id)); } else if("name".equals(tagName)) { // <name> person.setName(parser.nextText()); } else if("age".equals(tagName)) { // <age> person.setAge(Integer.parseInt(parser.nextText())); } break; case XmlPullParser.END_TAG: // </persons> if("person".equals(tagName)) { // 须要把上面设置好值的person对象加入到集合中 personList.add(person); } break; default: break; } // 获得下一个事件类型 eventType = parser.next(); } return personList; } catch (Exception e) { e.printStackTrace(); } return null; } }