jaxp解析器——sax

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jaxp解析器——sax相关的知识,希望对你有一定的参考价值。

   上篇对采用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的主要内容,如果未能解决你的问题,请参考以下文章

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

使用JAXP进行XM解析(基于DOM)

XML解析——jaxp

DOM解析器解析XML文档

XML解析器之JAXP与DOM4J

DOM的概念和简单应用:使用DOM解析XML数据