码迷,mamicode.com
首页 > 其他好文 > 详细

jaxp解析器——sax

时间:2018-04-05 13:24:40      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:jaxp的sax   xml解析   java   

   上篇对采用jaxp解析器使用dom技术解析xml做了一个介绍,对jaxp解析器使用sax技术解析xml则一笔带过了,接下来我们看看jaxp采用sax技术是如何解析xml的呢。

   采用sax技术解析xml是依靠于事件驱动的,边读边解析,相关类位于javax.xml.parsers包里面

           **SAXParser    此类的实例可以从SAXParserFactory的newSAXParser( )方法获得

                     |_ Parser( File f , DefaultHandler dh )   两个参数   *第一个参数:xml的路径    *第二个参数:事件处理器

           **SAXParserFactory     其实例可以通过本身的newInstance()方法得到

   **SAX执行过程

            |- 当解析到开始标签的时,自动执行startElement()方法

            |- 当解析到文本的时,自动执行characters()方法

            |_ 当解析到结束标签时,自动执行endElement()方法


   **使用jaxp的sax方式来解析xml

            *sax方式不能实现增删改操作,只能做查询操作

            *打印整个xml文档

                   执行parse()方法,第一个参数是xml路径,第二个参数是事件处理器

                           **创建一个类,继承事件处理器的类

                           **重写里面的三个方法

public class TestSax {
    public static void main(String[] args) throws Exception {
        /*
         * 1、创建解析器工厂
         * 2、根据工厂得到解析器
         * 3、调用解析器的parse方法
         * 4、创建继承事件处理器的类
         */
        //1、创建解析器工厂
        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
        //2、根据工厂得到解析器
        SAXParser saxParser=saxParserFactory.newSAXParser();
        //3、调用解析器的parse方法
        saxParser.parse("src/persion.xml", new MyHandler());
    }
}
class MyHandler extends DefaultHandler{
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.print("<"+qName+">");
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        System.out.print(new String(ch,start,length));
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.print("</"+qName+">");
    }    
}

            *获取到所有name的值

                           **定义一个成员变量flag=false

                           **判断开始方法是否是name元素,如果是name元素,把flag设置为true

                           **如果flag值为true,在character()方法里面打印内容

                           **当执行到结束方法时,把flag值设置成false

public class TestSax {
    public static void main(String[] args) throws Exception {
        /*
         * 1、创建解析器工厂
         * 2、根据工厂得到解析器
         * 3、调用解析器的parse方法
         * 4、创建继承事件处理器的类
         */
        //1、创建解析器工厂
        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
        //2、根据工厂得到解析器
        SAXParser saxParser=saxParserFactory.newSAXParser();
        //3、调用解析器的parse方法
        saxParser.parse("src/persion.xml", new MyHandler1());
    }
}
class MyHandler1 extends DefaultHandler{
    boolean flag=false;
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if("name".equals(qName)){
            flag=true;
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(flag==true){
            System.out.println(new String(ch,start,length));
        }
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if("name".equals(qName)){
            flag=false;
        }
    }
}

            *获取到第一个name的值

public class TestSax {
    public static void main(String[] args) throws Exception {
        /*
         * 1、创建解析器工厂
         * 2、根据工厂得到解析器
         * 3、调用解析器的parse方法
         * 4、创建继承事件处理器的类
         */
        //1、创建解析器工厂
        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
        //2、根据工厂得到解析器
        SAXParser saxParser=saxParserFactory.newSAXParser();
        //3、调用解析器的parse方法
        saxParser.parse("src/persion.xml", new MyHandler1());
    }
}
class MyHandler1 extends DefaultHandler{
    boolean flag=false;
    int idx=1;
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if("name".equals(qName)&&idx==1){
            flag=true;
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(flag==true){
            System.out.println(new String(ch,start,length));
        }
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if("name".equals(qName)){
            flag=false;
            idx++;
        }
    }
}


jaxp解析器——sax

标签:jaxp的sax   xml解析   java   

原文地址:http://blog.51cto.com/13537308/2094994

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!