android 实用sax 读取xml文件内容 附源码
andorid读取xml文件内容方法有三种 sax dom pull,其中 pull是android自带的
1.先认识一下xml文件中的些术语
<?xml version="1.0" encoding="UTF-8"?><persons><person id="23"><name>李明</name><age>23</age></person><person id="22"><name>李量</name><age>25</age></person></persons>
<?xml version="1.0" encoding="UTF-8"?><persons><person id="23"><name>李明</name><age>23</age></person><person id="22"><name>李量</name><age>25</age></person></persons>
package com.leequer.service.demo;/** * <person id="23"><name>李明</name><age>23</age></person><person id="22"><name>李量</name><age>25</age></person> * @author leequer * * xml文件对应的bean */public class Person {private Integer id;private String name;private int age;public Person (){}public Person (String name ,int age){this.name = name;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn this.id+",name "+this.name+" age "+this.age+"\n";}}package com.leequer.service;import java.io.InputStream;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.XMLReader;import com.leequer.service.demo.Person;public class SaxReadxml {public static List<Person> readXml(InputStream inStream)throws Exception {SAXParserFactory spf = SAXParserFactory.newInstance(); // 初始化sax解析器SAXParser sp = spf.newSAXParser(); // 创建sax解析器//XMLReader xr = sp.getXMLReader();// 创建xml解析器XMLContentHandler handler = new XMLContentHandler();sp.parse(inStream, handler);return handler.getPersons();}}sp.parse(inStream, handler);
package com.leequer.service;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import com.leequer.service.demo.Person;public class XMLContentHandler extends DefaultHandler {private List<Person> persons;private Person person;private String tempString;private static final String NAMESTRING = "name";private static final String AGESTRING = "age";private static final String PERSONSTRING = "person";private static final String IDSTRING = "id";public List<Person> getPersons() {return persons;}/** * sax 解析文件不带记忆,只读取 对xml文件中的 <person id="23"> <name>李明</name> <age>23</age> * </person> <person id="22"> <name>李量</name> <age>25</age> </person> 这部分感兴趣 * 那么这部分包含了person这个节点元素的开始和结尾,那么就要有startElement和endElement * 这两个方法;还有text的节点元素,(就是像节点之间的回车和空格还有标签中的像李明这样的文字都是文本节点 元素 * (text节点元素)那么要解析文本节点元素就要用到characters 这个方法来获取信息。) *//** * 要开始读取xml文件的时候调用的方法 * 初始化persons */@Overridepublic void startDocument() throws SAXException {//这里做list的初始化工作persons = new ArrayList<Person>();}/** * sax 读取到文本节点的时候调用了这个方法 */@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if (person != null) {String valueString = new String(ch, start, length);if (NAMESTRING.equals(tempString)) {// 如果当前解析到的节点是name 就要将name中的文本节点元素的值得到person.setName(valueString);} else if (AGESTRING.equals(tempString)) {person.setAge(new Integer(valueString).intValue());}}}/** * sax 读取到元素节点的时候用到这个方法; */@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {// 先判断读到的元素是否是personif (PERSONSTRING.equals(localName)) {// 如果读到的是person这个元素 就要保存起来,保存在我们创建的那个person的类中 所以我们要new一个person类person = new Person();// attributes是属性。person.setId(new Integer(attributes.getValue(IDSTRING)));} tempString = localName;}/** * 这个方法是每次遇到结束的标签都会执行的 并不是只遇到最后的结尾才调用 * * 读取完毕遇到person'的结尾 就将封装好的一个personbean保存到list中 并且清空person对象 * */@Overridepublic void endElement(String uri, String localName, String name)throws SAXException {if(PERSONSTRING.equals(localName)&&person!=null){persons.add(person);person = null;}tempString = null;}}package com.leequer.readxml;/** * 测试类 */import java.io.InputStream;import java.util.Iterator;import java.util.List;import com.leequer.service.SaxReadxml;import com.leequer.service.demo.Person;import android.test.AndroidTestCase;import android.util.Log;public class SaxReadxmlTest extends AndroidTestCase {private String PERSONSTRING = "ObjectPerson";public void testReadXml() throws Exception{//类装载器InputStream inputStream = SaxReadxmlTest.class.getClassLoader().getResourceAsStream("NewFile.xml");List <Person> personsList = SaxReadxml.readXml(inputStream);for (Iterator iterator = personsList.iterator(); iterator.hasNext();) {Person person = (Person) iterator.next();Log.i(PERSONSTRING, person.toString());}}}