sax解析xml
SAX是Simple API for XML的缩写,它并不是由W3C所提出的标准。SAX在解析文档的时候允许您在读取时处理它,从而不必等到整个文档被存储之后才能操作。SAX API是一个基于事件的API。适用于处理数据流,即随着数据的流动而依次处理数据。SAX 采用基于事件驱动的处理方式,它将xml文档转换成一系列的事件,有单独的事件处理器来决定如何处理。
在SAX接口中,事件源是org.xml.sax包中的XMLReader,通过parser()方法来解析xml文档,并根据文档内容产生事件。而时间处理器则是org.xml.sax包中的ContentHander、DTDHander、ErrorHander,以及EntityResolver这四个接口,它们分别处理事件源在解析XML文档过程中产生的不同类的事件,在开发过程中没有必要直接从这4个接口直接继承,因为org.xml.sax.helper包提供了DefaultHandler,继承了上面的4个接口,直接继承DefaultHandler就行了
<?xml version="1.0" encoding="UTF-8"?> <persons id="persons"> <person> <id>1</id> <name>张三</name> <age>20</age> <birthday>1992-01-01</birthday> <address>广东深圳</address> </person> <person> <id>2</id> <name>张角</name> <age>30</age> <birthday>1972-02-02</birthday> <address>河南开封</address> </person> <person> <id>3</id> <name>张飞</name> <age>25</age> <birthday>1987-03-03</birthday> <address>河南郑州</address> </person> </persons>
1 public class SaxTest extends DefaultHandler{ 2 //此处将xml里的数据封装成Person类,presonList用于存储解析后的数据 3 List<Person> personList; 4 private String currentTag; 5 private Person person; 6 /** 7 * 解析xml时,当时开始读取xml文档时 8 */ 9 @Override 10 public void startDocument() throws SAXException { 11 super.startDocument(); 12 personList = new ArrayList<Person>(); 13 System.out.println("开始解析该文档"); 14 } 15 16 @Override 17 public void endDocument() throws SAXException { 18 super.endDocument(); 19 System.out.println("文档解析结束"); 20 } 21 /** 22 * 解析xml时,当开始读到一个元素标签开始时 23 */ 24 @Override 25 public void startElement(String uri, String localName, String qName, 26 Attributes attributes) throws SAXException { 27 super.startElement(uri, localName, qName, attributes); 28 System.out.println("开始解析元素"); 29 if(qName.equals("person")){ 30 person = new Person(); 31 } 32 currentTag = qName;//元素名称 33 } 34 35 @Override 36 public void endElement(String uri, String localName, String qName) 37 throws SAXException { 38 super.endElement(uri, localName, qName); 39 System.out.println("元素解析结束"); 40 //将当前标签名置空 41 currentTag = null; 42 //如果当前结束的标签名是person的话,代表一个person对象已经读取完毕,将其添加到list后置空 43 if (qName.equals("person")) { 44 personList.add(person); 45 person = null; 46 } 47 } 48 49 @Override 50 public void characters(char[] ch, int start, int length) 51 throws SAXException { 52 super.characters(ch, start, length); 53 //判断当前标签是否有效 54 if(currentTag != null){ 55 //读取标签里面的内容 56 String value = new String(ch,start,length); 57 //如果是id标签,则读取id标签的内容设置到Person的Id值上 58 if ("id".equalsIgnoreCase(currentTag)) { 59 person.setId(Integer.parseInt(value)); 60 }else if ("name".equalsIgnoreCase(currentTag)) { 61 person.setName(value); 62 }else if ("age".equalsIgnoreCase(currentTag)) { 63 person.setAge(Integer.parseInt(value)); 64 }else if ("address".equalsIgnoreCase(currentTag)) { 65 person.setAddress(value); 66 }else if ("birthday".equalsIgnoreCase(currentTag)) { 67 try { 68 person.setBirthday(pareDate(value)); 69 } catch (Exception e) { 70 e.printStackTrace(); 71 } 72 } 73 } 74 } 75 76 public static List<Person> getPersonInfos(String queryString){ 77 //得到sax解析工厂 78 SAXParserFactory factory = SAXParserFactory.newInstance(); 79 try { 80 //创建解析器 81 SAXParser parser = factory.newSAXParser(); 82 XMLReader reader = parser.getXMLReader(); 83 //得到输入流 84 InputStream inputStream= SaxTest.class.getResourceAsStream(queryString); 85 InputSource source = new InputSource(inputStream); 86 //得到SAX解析实现类 87 SaxTest handler = new SaxTest(); 88 reader.setContentHandler(handler); 89 //开始解析 90 reader.parse(source); 91 return handler.personList; 92 } catch (ParserConfigurationException e) { 93 e.printStackTrace(); 94 } catch (SAXException e) { 95 e.printStackTrace(); 96 } catch (MalformedURLException e) { 97 e.printStackTrace(); 98 } catch (IOException e) { 99 e.printStackTrace(); 100 } 101 return null; 102 } 103 public static void main(String[] args) { 104 List<Person> list = new ArrayList<Person>(); 105 list = getPersonInfos("person.xml"); 106 if(list != null){ 107 for(Person per :list){ 108 System.out.println(per.getId()+"\t"+per.getName()+"\t"+per.getAge()+"\t"+per.getAddress()+"\t"+dateToString(per.getBirthday())); 109 } 110 } 111 } 112 113 public static Date pareDate(String dateString) throws Exception{ 114 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 115 Date date = null; 116 date = format.parse(dateString); 117 return date; 118 } 119 120 public static String dateToString(Date date){ 121 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 122 String dateString; 123 dateString = format.format(date); 124 return dateString; 125 } 126 }
参考与:http://blog.163.com/liyinhui20080527@126/blog/static/815232582012114115014900/