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/

posted @ 2012-10-19 14:53  胖hu  阅读(248)  评论(0编辑  收藏  举报