/*** * 采集SAX解析XML * 优点:解析快,占用内在少;是采集的事件驱动模式解析的; * 事件驱动:它并不需要解析完整个文档,而是按内容的顺序解析文档, * SAX会判断当前读到的字符是否符合XML语法的某部分,如果符合就会触发事件;事件就是回调方法 * * @author Administrator * */ public class SaxXml { /** * 解析后并返回一个对象集合 * * @param inStream * xml输入流 * @return 解析后并返回一个对象集合 * @throws ParserConfigurationException * @throws SAXException * @throws IOException */ public List<Person> saxParser(InputStream inStream) throws ParserConfigurationException, SAXException, IOException { // 创建一个生成SAX对象的工厂 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); // 新闻一个SAX解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); // 通过这个对象来解析:是通过驱动事件解析 PersonParser personParser = new PersonParser(); // 把要解析的xml输入流通过personParser解析 saxParser.parse(inStream, personParser); // 关闭流 inStream.close(); // 返回解析后对对象集合 return personParser.getPersons(); } /** * 处理xml的事件类 * @author Administrator * */ private final class PersonParser extends DefaultHandler { private List<Person> persons = null; private Person person = null; private String TAG = null; public List<Person> getPersons() { return persons; } /** * 当执行到第一行时就是:开始文档语法;就会执行这个方法; * 这时我们创建一个Person的List集合 */ public void startDocument() throws SAXException { persons = new ArrayList<Person>(); } /** * 当符合元素语法时就会执行这个方法;我们这里判断的是; * person元素 */ public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if ("person".equals(localName)) { person = new Person(); person.setId(new Integer(attributes.getValue(0))); } TAG = localName; } /** * 这里是判断的是文本节点 */ public void characters(char[] ch, int start, int length) throws SAXException { if (TAG != null) { if ("name".equals(TAG)) { person.setName(new String(ch, start, length)); } else if ("age".equals(TAG)) { person.setAge(new Short(new String(ch, start, length))); } } } /** * 如果一个元素执行完后.就把这个元素放到List集合里面 * 如:当执行到</person>时会执行这个方法 */ public void endElement(String uri, String localName, String name) throws SAXException { if ("person".equals(localName)) { persons.add(person); person = null; } TAG = null; } } }
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>secn1</name> <age>231</age> </person> <person id="2"> <name>secn2</name> <age>232</age> </person> <person id="3"> <name>secn3</name> <age>233</age> </person> <person id="4"> <name>secn4</name> <age>234</age> </person> </persons>
public void testReadSAX() throws ParserConfigurationException, SAXException, IOException{ SaxXml sax = new SaxXml(); InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("secn.xml"); List<Person> persons = sax.saxParser(inStream); for(Person person:persons){ Log.i("SaxTest", String.valueOf(person.getName())); } }