jaxp的sax解析API

1 sax解析的原理
事件驱动,边读边解析
两个类 SAXParser SAXParserFactory
解析方法:parse(xml的路径,事件处理器)
解析过程:
当解析到开始标签的时候,执行startElement方法,参数qName返回标签名称。
当解析到开始标签的时候,执行characters方法,通过starting的构造方法返回内容
当解析到开始标签的时候,执行endElement方法,参数qName返回标签名称。

2 使用jaxp的sax方式解析xml
sax方式不能实现增删改操作,只能做查询操作
** 打印整个文档

package cn.jaxptest;

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 TestSax {
    /*
     * 1、 创建解析器工厂
     * 2、创建解析器 
     * 3、执行parse方法 
     * 4、创建一个类,继承DefaultHandler 
     * 5、 重写类里面的三个方法
     */
    public static void main(String[] args) throws Exception {
        
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //执行parse方法,第一个参数是xml路径,第二个参数是时间处理器(会自动执行里面的三个方法)
        saxParser.parse("src/person.xml", new Mydefault());
    
    }

}
class Mydefault 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 {
        // TODO Auto-generated method stub
        System.out.print(new String(ch, start, length));
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.print("</"+qName+">");

    }

}

 3 打印出所有name标签里的内容

class Mydefault 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 {
        // TODO Auto-generated method stub
    //当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 {
        if("name".equals(qName)) {
            flag=false;
        }

    }

}

猜你喜欢

转载自www.cnblogs.com/zecdllg/p/9110711.html