SAX使用示例

来源:岁月联盟 编辑:zhuzhu 时间:2009-05-01

  [环境]:SAX 2.0 ,Xerces-J 2.9.1

  1、SAX2.0使用org.xml.sax.XMLReader接口代替了Parser接口。如果要使用SAX解析XML,那么首先要获得XMLReader的一个实现对象。

  

   (1)、使用javax.xml.parsers.SAXParser创建XMLReader

   Sun JDK提供了javax.xml.parsers.SAXParser,由SAXParser可以获取一个XMLReader。由于javax.xml.parsers.SAXParser是JDK自带驱动,所以,直接编译就可以运行了。           

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);//开启验证XML功能
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();

   (2)、使用第三方驱动。本例使用Xerces驱动:               org.apache.xerces.parsers.SAXParser。

   Xerces驱动下载地址:http://xerces.apache.org/xerces2-j/。

   下载后,找到xercesImpl.jar,并将其加入到classpath路径中。如果不加入classpath路径,可以在编译运行时指定xercesImpl.jar的位置。例:

javac -cp "xercesImpl.jar;." SAXDemo.java
java -cp "xercesImpl.jar;." SAXDemo

   此时,创建XMLReader代码如下:

XMLReader reader = XMLReaderFactory.createXMLReader();

   但是运行时要指定驱动的位置:

java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser SAXDemo

   也可以在代码中指定具体驱动:

String driver = "org.apache.xerces.parsers.SAXParser";
XMLReader reader = XMLReaderFactory.createXMLReader(driver);

   或者直接创建一个XMLReader:

XMLReader reader = new org.apache.xerces.parsers.SAXParser();

   2、得到XMLReader对象之后就可以解析XML了。SAX是基于事件的,所以,还要设置内容事件处理器ContentHandler和其它事件处理器,DefaultHandler是对ContentHandler等事件处理接口的一个默认实现,如果熟悉AWT/Swing事件处理机制,便不难理解。当然还需要一个InputSource来指定所要解析的XML文件。

reader.setFeature("http://xml.org/sax/features/validation", false);
reader.setContentHandler(mySAXHandler);
reader.setErrorHandler(mySAXHandler);

  reader.parse(input);//input是InputSouce类型

   3、SAX解析XML完整的代码实现(注释中包含使用Xerces驱动的方法,可根据需要删除或选用):

/**
 * SAX使用示例
 *
 *Usage:
 *如果未用到Xerces驱动,则直接编译运行。
 *如果用Xerces驱动,则编译运行如下:
 * javac -cp "xercesImpl.jar;." SAXDemo.java
 * java -cp "xercesImpl.jar;." SAXDemo
 *
 * @version 2009-4-25
 * @author Winty(wintys@gmail.com)
 */
import java.io.*;

import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.XMLReader;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXParseException;

import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class SAXDemo extends DefaultHandler{
    Writer writer;
    InputSource input;

    public SAXDemo(InputSource input ,  Writer writer){
        this.input = input;
        this.writer = writer;
    }

    public static void main(String[] args)throws Exception{
        InputSource input;
        Writer writer;
        SAXDemo saxDemo;

        input = new InputSource(new FileReader("cdcatalog.xml"));
        writer = new OutputStreamWriter(System.out);
        //writer = new FileWriter("result.txt");
        saxDemo= new SAXDemo(input , writer);

        saxDemo.parse();
    }

    public void parse(){
        XMLReader reader;
        try{
            reader = getXMLReader_Java();

            /*方法2:
            使用Xerces驱动:org.apache.xerces.parsers.SAXParser,
            需指定:java -cp "xercesImpl.jar;." SAXDemo
            */
            //如果使用Xerces驱动,则去除相应方法的注释即可。
            //reader = getXMLReader_Xerces1();
            //reader = getXMLReader_Xerces2();
            //reader = getXMLReader_Xerces3();
           
            MySAXHandler mySAXHandler = new MySAXHandler(writer);
            reader.setFeature("http://xml.org/sax/features/validation", false);
            reader.setContentHandler(mySAXHandler);
            reader.setErrorHandler(mySAXHandler);

            reader.parse(input);
        }catch(SAXException e){
            System.err.println(e.getMessage());
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    //方法1:使用javax.xml.parsers.SAXParser驱动
    private XMLReader getXMLReader_Java()throws SAXException {
        XMLReader reader = null;
        try{
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setValidating(true);
            SAXParser parser = factory.newSAXParser();
            reader = parser.getXMLReader();
        }catch(ParserConfigurationException e){
            System.err.println(e.getMessage());
        }

        return reader;
    }

    /**
     *方法2-1:
     */
    /*private XMLReader getXMLReader_Xerces1()throws SAXException{
        String driver = "org.apache.xerces.parsers.SAXParser";

        return XMLReaderFactory.createXMLReader(driver);
    }*/

    /* 方法2-2:
     * 还需指定driver类: java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser
     */
    /*private XMLReader getXMLReader_Xerces2()throws SAXException{
        return XMLReaderFactory.createXMLReader();
    }*/

    /**
     * 方法2-3:
     * 还需指定:javac -cp "xercesImpl.jar;."
     */
    /*private XMLReader getXMLReader_Xerces3()throws SAXException{
        return (new org.apache.xerces.parsers.SAXParser());
    }*/
}

class MySAXHandler extends DefaultHandler{
    private Writer writer;

    public MySAXHandler(Writer writer){
        this.writer = writer;
    }

    public void startDocument()throws SAXException{
        try{
            writer.write("开始解析XMLn");
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void endDocument()throws SAXException{
        try{
            writer.write("n解析XML结束");
            writer.close();
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void startElement(String uri,
                                         String localName,
                                         String qName,
                                         Attributes attributes)
        throws SAXException{

        try{
            writer.write("<" qName ">");
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void endElement(String uri,
                                        String localName,
                                        String qName)
        throws SAXException{

        try{
            writer.write("</" qName ">");
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void characters(char[] ch,int start,int length)throws SAXException{
        try{
            String str = new String(ch , start , length);
            writer.write(str);
        }catch(IOException e){
            System.err.println(e.getMessage());
        }
    }

    public void error(SAXParseException e)throws SAXException{
        System.err.println(e.getMessage());
    }

    public void warning(SAXParseException e)throws SAXException{
        System.err.println(e.getMessage());
    }

    public void fatalError(SAXParseException e)throws SAXException{
        System.err.println(e.getMessage());
    }
}

  出处:http://www.blogjava.net/wintys