为了账号安全,请及时绑定邮箱和手机立即绑定

jaxp解析器——sax

标签:
JQuery

   上篇对采用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++;        }    }}


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消