• jaxp的Sax解析


    在使用DOM解析XML时候,需要读取整个XML文档,在内存架构代表整个DOM树的Document对象,从而再对XML文档操作,如果XML文件特别大,就特别消耗内存。SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
    解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
    事件处理器由程序员自定义,继承自DefaultHandler。

    举个例子
    使用sax解析下面的xml文件---cd.xml。打印出里面所有属于UK的专辑作者
     
    <?xml version="1.0" encoding="UTF-8"?>
    <CATALOG>
        <CD>
            <TITLE>Empire Burlesque</TITLE>
            <ARTIST>Bob Dylan</ARTIST>
            <COUNTRY>USA</COUNTRY>
            <COMPANY>Columbia</COMPANY>
            <PRICE>10.90</PRICE>
            <YEAR>1985</YEAR>
        </CD>
        <CD>
            <TITLE>Hide your heart</TITLE>
            <ARTIST>Bonnie Tyler</ARTIST>
            <COUNTRY>UK</COUNTRY>
            <COMPANY>CBS Records</COMPANY>
            <PRICE>9.90</PRICE>
            <YEAR>1988</YEAR>
        </CD>
        <CD>
            <TITLE>Greatest Hits</TITLE>
            <ARTIST>Dolly Parton</ARTIST>
            <COUNTRY>USA</COUNTRY>
            <COMPANY>RCA</COMPANY>
            <PRICE>9.90</PRICE>
            <YEAR>1982</YEAR>
        </CD>
        <CD>
            <TITLE>Still got the blues</TITLE>
            <ARTIST>Gary Moore</ARTIST>
            <COUNTRY>UK</COUNTRY>
            <COMPANY>Virgin records</COMPANY>
            <PRICE>10.20</PRICE>
            <YEAR>1990</YEAR>
        </CD>
        <CD>
            <TITLE>Eros</TITLE>
            <ARTIST>Eros Ramazzotti</ARTIST>
            <COUNTRY>EU</COUNTRY>
            <COMPANY>BMG</COMPANY>
            <PRICE>9.90</PRICE>
            <YEAR>1997</YEAR>
        </CD>
        <CD>
            <TITLE>One night only</TITLE>
            <ARTIST>Bee Gees</ARTIST>
            <COUNTRY>UK</COUNTRY>
            <COMPANY>Polydor</COMPANY>
            <PRICE>10.90</PRICE>
            <YEAR>1998</YEAR>
        </CD>
    </CATALOG>
    import java.io.IOException;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class SaxParse {
    
        public static void main(String[] args) {
                SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
                try {
                    SAXParser saxParser = saxParserFactory.newSAXParser();
                    MyHandler myHandler=new MyHandler();
                    saxParser.parse("cd.xml", myHandler);
                    
                } catch (ParserConfigurationException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            
        }
    }
    
    class MyHandler extends DefaultHandler{//继承DefaultHandler,然后重写父类方法
        //两个类成员,用于在方法之间保存数据
        boolean flag=false;
        String artist;
        @Override
        public void startDocument() throws SAXException {
            //System.out.println("MyHandler.startDocument()====>开始解析文档");
        }
    
        @Override
        public void endDocument() throws SAXException {
            //System.out.println("MyHandler.endDocument()====>结束解析文档");
        }
    
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            //System.out.println("MyHandler.startElement()====>开始解析元素");
            //解析到了<ARTIST>这一元素,传递一个信号给characters()方法,将每个作者都保存到artist
            if (qName.equals("ARTIST")) {
                flag=true;
            }
    
        }
    
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            //System.out.println("MyHandler.endElement()====>结束解析元素");
        }
    
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            //System.out.println("MyHandler.characters()====>得到元素的文本");
            //解析到了<ARTIST>这一元素,将每个作者都保存到artist
            if (flag) {
                artist=new String(ch, start, length);
                flag=false;
            }
            //如果<COUNTRY>元素的文本是UK,就输出作者名字
            String uk=new String(ch, start, length);
            if (uk.equals("UK")) {
                System.out.println("The artist from UK----->"+artist);
            }    
        }
            
        
        
    }
     
  • 相关阅读:
    7.4mybatis整合ehcache(mybatis无法实现分布式缓存必须和其他缓存框架整合)
    Mybatis-利用resultMap 输出复杂pojo
    1.2MyBatis介绍
    1Mybatis入门--1.1单独使用jdbc编程问题总结
    AJAX的来龙去脉(由来)-如何被封装出来的--ajax发送异步请求(四步操作)
    人人权限 添加一张表查询出来
    salesforce lightning零基础学习(九) Aura Js 浅谈二: Event篇
    salesforce lightning零基础学习(八) Aura Js 浅谈一: Component篇
    salesforce lightning零基础学习(七) 列表展示数据时两种自定义编辑页面
    salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
  • 原文地址:https://www.cnblogs.com/linchaohao/p/5143843.html
Copyright © 2020-2023  润新知