• 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/

  • 相关阅读:
    C#转C++的一点分享
    数据挖掘十大经典算法
    在硅谷面试:如何证明你是最优秀的?
    .NET技术+25台服务器怎样支撑世界第54大网站
    如何将Vim打造成一个成熟的IDE
    24点算法
    12个Web设计师必备的Bootstrap工具
    程序员必须进行的10项投资
    转载:传说中的T检验
    三测
  • 原文地址:https://www.cnblogs.com/hujia/p/2731047.html
Copyright © 2020-2023  润新知