//MySAXExample.java
/**
*SAX作为一种处理模型非常简单,基本由如下三个步骤组成:
*1、实现一个扩展DefaultHandler的类,作为每种类型的结构包含回调(callback)方法,而这些类型的结构是在包含了基于您需要的实现方案中找到的
*2、初始化一个新的SAX Parser类。Parser读取XML源文件,并触发DefaultHandler类中所实现的一个回调方法
*3、顺序读取XML源文件。在顺序读取中,无法随机访问结构中的元素。剩下的工作取决于Handler类中您的实现方案.
*/
import javax.xml.parsers.*;
class MySAXExample{
public MySAXExample(){}
public static void main(String[] args){
try{
/**
* 利用SAXParserFactory的静态newInstance()方法获取一个factory类
*/
SAXParserFactory factory = SAXParserFactory.newInstance();
/**
* 通过调用newSAXParser()静态方法从factory中获取SAX分析器
*/
SAXParser parser = factory.newSAXParser();
/**
* 分析XML数据:调用SAXParser的分析方法,把XML输入作为第一个参数,而DefaultHandler实现方案作为第二个参数
*/
parser.parse("PurchaseOrder.xml",new MySAXExampleHandler());
}
/**
* 使用的factory类是作为系统属性、jar服务或者平台的默认值提供的。如果属性在运行时没有找到,则抛出一个FactoryConfigurationError
* 错误,同时给出一条消息,说明问题的起因。分析器factory可以经过补充配置,以创建验证和(或)支持命名空间分析器的实例。分析器没有返回
* 属性时,抛出一个ParserConfigurationException异常。
*/
catch(FactoryConfigurationError fce){
System.out.println("FactoryConfiguration occurred:"+fce);
}
catch(ParserConfigurationException pce){
System.out.println("ParserConfigurationException occurred:"+pce);
}
catch(Exception e){
System.out.println("Exception occurred:"+e);
}
}
}
//****************************************************************************************
//MySAXExampleHandler.java
import org.xml.sax.*;
//import org.xml.sax.helpers;
//import org.xml.sax.ext.*;
import org.xml.sax.helpers.DefaultHandler;
/**
*JAXP特有的SAX处理XML步骤如下:
*1、获取Factory和Parser类来实现XML处理。
*2、设置命名空间、有效性验证等选项以及功能。
*3、创建一个DefaultHandler实现方案类。
*/
public class MySAXExampleHandler extends DefaultHandler{
public MySAXExampleHandler(){}
public void startDocument() throws SAXException{ //startDocument():仅在XML文档开始时调用该方法
System.out.println("START DOCUMENT");
System.out.println("<?xml version='1.0'?>");
}
public void endDocument() throws SAXException{ //endDocument():当分析器到达XML文档的末端时调用该方法
System.out.println("END DOCUMENT");
}
public void characters(char bur[], //characters():对元素中包含的字符数据调用该方法
int offset,
int len)
throws SAXException{
String s = new String(bur,offset,len);
System.out.println(s);
}
public void startElement(String namespaceURI, //startElement():每次遇到一个新的开始标记或者元素时(例如,<element>),就调用该方法
String localName,
String rawName,
Attributes attrs)
throws SAXException{
System.out.print("<"+localName);
int length = attrs.getLength();
for(int i=0;i<length;i++){
System.out.print(""+attrs.getLocalName(i)+
"="+attrs.getValue(i));
}
System.out.println(">");
}
public void endElement(String namespaceURI, //endElement():当元素结束时(例如,<element>,就调用该方法
String localName,
String rawName)
throws SAXException{
System.out.println("</"+localName+">");
}
}