jaxp的sax方式解析xml

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


sax解析过程:看图,这个图非常的重要,图可能不大清晰,我解释一下:也就是说,在使用sax解析过程中,遇到起始标签时,会自动调用startElement(),然后读到文本时,自动调用了qName();遇到结束标签时,自动调用了endElement();而这三个方法都是在DefaultHandler类中,所以你想要查询打印文本还是标签的名字,你就可以去继承该DefaultHandler类,在自动调用的时候去打印,或者做一些操作

这里写图片描述

也就是说:它会自动调用了三个方法

//这三个方法就是在DefaultHandler类中,所以只要继承这个类,然后重写就可以了,输出你想要输出的东西
startElement(); 开始标签
qName();        中间文本
endElement()    结束标签


2、解析xml文件,跟dom解析一样,三部曲

//创建解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//执行parse方法
saxParser.parse("src/p1.xml", new MyDefault2());    


3、直接写案例:打印出整个文档

//三部曲
//创建解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//执行parse方法
saxParser.parse("src/p1.xml", new MyDefault2());

//同一个文件中写多一个类,然后继承了DefaultHandler,重写里面的方法
class MyDefault1 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+">");
    }   
}


4、 获取到所有的name元素的值

//实现获取所有的name元素的值
class MyDefault2 extends DefaultHandler {
    boolean flag = false;
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        //判断qName是否是name元素
        if("name".equals(qName)) {
            flag = true;            
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //当flag值是true时候,表示解析到name元素
        if(flag == true) {
            System.out.println(new String(ch,start,length));
        }
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //把flag设置成false,表示name元素结束
        if("name".equals(qName)) {
            flag = false;
        }
    }
}


5、获取第二个name元素的值

//实现获取第二个name元素的值
class MyDefault2 extends DefaultHandler {
    boolean flag = false;
    int idx = 1;
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        //判断qName是否是name元素
        if("name".equals(qName)) {
            flag = true;            
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //当flag值是true时候,表示解析到name元素
        //索引是2
        if(flag == true && idx == 2) {
            System.out.println(new String(ch,start,length));
        }
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //把flag设置成false,表示name元素结束
        if("name".equals(qName)) {
            flag = false;
            idx++;
        }
    }

}

也就是,你要怎么查询,只需要在MyDefault2 中去重写里面的方法就可以 ,一般只能查询,少用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值