JAXP的SAX解析XML

时间:2019-06-12
本文章向大家介绍JAXP的SAX解析XML,主要包括JAXP的SAX解析XML使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

* XML的编程

              * JAXP的SAX解析(了解的怎么样解析)

                     * 只能做查询,不能做增删改。

                     * SAX解析(需要:解析器和时间处理器)

                            * 解析器

                                   * 获取解析器的工厂

                                   * 获取解析器对象

                                   * 解析XML(XML的文件的地址,事件处理器) 

                            * 事件处理器

                                   * 自己编写的类,需要继承DefalutHandler类,重写三个方法。

                                   * startElement()

                                   * characters()

                                   * endElement()

              注意:startDocument默认自动识别<?xml version=”1.0” encoding=”UTF_8”>

                         endDocument默认自动识别结束标签</root>

* SAX的解析原理:           

      解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分(边读边解析),都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前         解析到的xml文件内容作为方法的参数传递给事件处理器。

           事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

  

箭头代表进行解析时,默认的自动调用的方法。

              Sax解析步骤

                     *创建一个类继承DefaultHandl

                     *重写三个方法

package cn.itcast.jaxp.sax;

import javax.xml.parsers.ParserConfigurationException;
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;

/**
 * SAX的入门
 * @author Administrator
 *
 */
public class JaxpSaxTest {
    
    public static void main(String[] args) {
        try {
            run1();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 获取所有的解析的内容
     * @throws Exception 
     * @throws ParserConfigurationException 
     */
    public static void run1() throws Exception{
        // 获取SAX的解析器工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 获取解析器
        SAXParser parser =  factory.newSAXParser();
        // 解析
        parser.parse("src/book2.xml", new MyHandler2());
    }
}


/**
 * 获取作者标签的文本内容
 *     
 */
class MyHandler2 extends DefaultHandler{
    // 如果解析到作者标签的时候,flag设置成true
    private boolean flag = false;
    private int count = 0;
    
    /**
     * 默认解析开始标签,默认调用该方法
     */
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // 如果要是作者标签,flag设置成true
        if("作者".equals(qName)){
            flag = true;
            count++;
        }
    }

    /**
     * 能控制characters的输出,我只在解析作者标签的时候,才打印
     */
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // 如果flag是true,就打印
        // 每一次都打印
        if(flag && count == 1){
            String str = new String(ch,start,length);
            System.out.println(str);
        }
    }
    
    /**
     * 
     */
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // flag恢复成false
        flag = false;
    }
}


/**
 * 自己事件处理器
 * 重写三方法
 * @author Administrator
 *
 */
class MyHandler extends DefaultHandler{
    
    /**
     * 只要一解析到开始标签的时候,默认调用该方法,把解析的内容赋值给参数。
     */
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("开始标签:"+qName);
    }
    /**
     * 只要解析到文本的内容,默认调用该方法
     */
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String str = new String(ch,start,length);
        System.out.println(str);
    }
    /**
     * 解析到结束标签的时候,默认调用方法,把解析的内容赋值给参数。
     */
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("结束标签:"+qName);
    }
    
}

原文地址:https://www.cnblogs.com/zsj03180204/p/11010836.html