zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    Visual Studio 2010使用Visual Assist X的方法
    SQL Server 2000 评估版 升级到 SQL Server 2000 零售版
    双网卡多网络单主机同时访问
    开发即过程!立此纪念一个IT新名词的诞生
    delphi dxBarManager1 目录遍历 转为RzCheckTree2树
    5320 软件集合
    delphi tree 从一个表复制到另一个表
    DELPHI 排课系统课表
    长沙金思维 出现在GOOGLE的 金思维 相关搜索里啦!!
    如何在DBGrid的每一行前加一个单选框?
  • 原文地址:https://www.cnblogs.com/hujia/p/2731047.html
Copyright © 2011-2022 走看看