1.常见的XML解析方式有三种,DOM、SAX、Pull,Android系统中推荐使用Pull
2.Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目
3.Android SDK中已经集成了Pull解析器,无需添加任何jar文件
4.Pull解析器运行方式与SAX类似,提供各种事件的判断
5.官方网站:http://xmlpull.org/
使用Pull解析器解析XML文件
1. Xml.newPullParser() 获得解析器
2 parser.setInput(in, "UTF-8") 设置输入流以及编码
3. parser.next() 获取下一个解析事件,得到一个事件代码
4. XmlPullParser中定义了常量来标识各种解析事件
START_DOCUMENT、END_DOCUMENT 、START_TAG 、END_TAG 、TEXT
1.使用pull解析xml
person.xml文件,需要解析的源文件
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="20"> <name>zizhu</name> <age>20</age> </person> <person id="30"> <name>zizhu5</name> <age>22</age> </person> </persons>解析代码:
/** * @param is 输入流 * @return * @throws Exception */ public List<Person> getPersons(InputStream is) throws Exception{ List<Person> persons = null; Person person = null; XmlPullParser pullParse = Xml.newPullParser();//google自带的工具栏生成pullParse,由于android本身集成了pull解析器 pullParse.setInput(is, "UTF-8"); int event = pullParse.getEventType();//pull解析器通过事件触发,start document事件需要通过这个方法获得 while(event != XmlPullParser.END_DOCUMENT){ switch (event) { case XmlPullParser.START_TAG://开始标签 if("persons".equals(pullParse.getName())){//匹配标签 persons = new ArrayList<Person>();//初始化 } if("person".equals(pullParse.getName())){ person = new Person(); int id = Integer.parseInt(pullParse.getAttributeValue(0)); person.setId(id); } if("name".equals(pullParse.getName())){ String name = pullParse.nextText();//得到标签里面的文本值 person.setName(name); } if("age".equals(pullParse.getName())){ int age = Integer.parseInt(pullParse.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG: if("person".equals(pullParse.getName())){ persons.add(person); person = null; } break; } event = pullParse.next(); } return persons; }
/** * 将数据存成xml格式的数据 * @param persons * @param os 输出流 * @throws Exception */ public void save(List<Person> persons , OutputStream os ) throws Exception{ XmlSerializer serial = Xml.newSerializer(); serial.setOutput(os, "UTF-8"); //xml文档开始 serial.startDocument("UTF-8", true);//第一个参数是编码,第二个参数表示此xml文件是否能单独存在 serial.startTag(null, "persons");//根节点 for(Person person : persons){ serial.startTag(null, "person"); serial.attribute(null, "id", person.getId() + ""); //name标签 serial.startTag(null, "name"); serial.text(person.getName()); serial.endTag(null, "name"); //age标签 serial.startTag(null, "age"); serial.text(person.getAge() + ""); serial.endTag(null, "age"); serial.endTag(null, "person"); } serial.endTag(null, "persons"); serial.endDocument(); os.flush(); }