XML解析之SAX解析

来源:互联网 发布:阿里云服务器托管 编辑:程序博客网 时间:2024/05/22 08:07
 概念: SAX(simple API for XML)是一种XML解析的替代方法。 而且相比于DOM,SAX可以在解析文档的任意时刻停止解析, 但任何事物都有其相反的一面,对于SAX来说就是操作复杂。它也是事件驱动的

思想 :

  1. 和pull解析一样,要有一个工厂
  2. 用sax工厂方法,得到sax解析器
  3. 设置文件来源,和handler
  4. 使用代理的handler,进行解析
  5. 重写handler的方法
  6. 重点看代码

写了一天的代码,不想说话,看代码

  static List<Play> list = null;   //储存所有的play对象    static Play p = null;    private static void xmlSaxParserDemo() {        try {            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();            parser.parse(new FileInputStream("E:\\CodeDemo\\HttpUrlConnection\\paly.xml"),new MyHandler());            for (int i = 0; i < list.size(); i++) {                System.out.println(list.get(i));            }        } catch (ParserConfigurationException e) {            e.printStackTrace();        } catch (SAXException e) {            e.printStackTrace();        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    static class MyHandler extends DefaultHandler {        int type = -1; //用于开始节点的标识        @Override        public void startDocument() throws SAXException {            System.out.println("startDocument");  //用于初始化数据,如果没必要就不需要重写  只是执行一次        }        @Override        public void endDocument() throws SAXException {  //文档结束时调用, 只是执行一次,可以不重写            System.out.println("endDocument");        }        @Override        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {            //开始元素,是重点, 在这里进行分析            //qName就是我们的数据            switch (qName) {                case "PlayList":                    list = new ArrayList<>();                    break;                case "media":                    p = new Play();                    for (int i = 0; i < attributes.getLength(); i++) {                        p.setDay(Integer.parseInt(attributes.getValue("day")));                        p.setId(Integer.parseInt(attributes.getValue("id")));                    }                    break;                case "type":                    type = 0;                    break;                case "name":                    type = 1;                    break;                case "path":                    type = 2;     // 0,1,2用于下面方法 进行获取数据时,判断                    break;                default:                    break;            }        }        @Override        public void endElement(String uri, String localName, String qName) throws SAXException {            //     System.out.println("endElement: " + "uri = " + uri + " localName = " + localName + " qName = " + qName);            //这是只对media 处理            if (qName.equals("media")) {                list.add(p);            }        }        @Override        public void characters(char[] ch, int start, int length) throws SAXException {         //      System.out.println("content: " + new String(ch,start,length));            String content = new String(ch,start,length);            switch (type) {                case 0:                    p.setType(Integer.parseInt(content));                    break;                case 1:                    p.setName(content);                    break;                case 2:                    p.setPath(content);                    break;            }            type = -1;  //一定要记得置位 !        }    }}
0 0
原创粉丝点击