随笔 - 117  文章 - 72  trackbacks - 0

声明:原创作品(标有[原]字样)转载时请注明出处,谢谢。

常用链接

常用设置
常用软件
常用命令
 

订阅

订阅

留言簿(7)

随笔分类(130)

随笔档案(123)

搜索

  •  

积分与排名

  • 积分 - 154355
  • 排名 - 389

最新评论

[标题]:[原]SAX使用示例
[时间]:2009-4-25
[摘要]:本文介绍了SAX解析XML的方法。还阐述了创建XMLReader两种方法。一种是使用javax.xml.parsers.SAXParser驱动,另一种是使用第三方驱动org.apache.xerces.parsers.SAXParser。
[关键字]:XML, Java,SAX,SAX Driver,SAX 驱动 , XMLReader,
xerces,SAX2.0,JAXP,
"System property org.xml.sax.driver not specified",
"SAX2 driver class org.apache.xerces.parsers.SAXParser not found"
[环境]:SAX 2.0 ,Xerces-J 2.9.1
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
    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("开始解析XML\n");
        }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());
    }
}

附件下载(附件内容:xercesImpl.jar、SAXDemo.java、cdcatalog.xml):SAXDemo.zip
原创作品,转载请注明出处。
作者:Winty (wintys@gmail.com)
博客:http://www.blogjava.net/wintys

posted on 2009-04-26 19:18 天堂露珠 阅读(2546) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: