[标题]:[原]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 ([email protected]) 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(
[email protected])
*/
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