SAX采用的是事件驱动模型。需要先定义一些方法,解析器解析时,当触发事件时,会自动调用响应的已经定义好的方法。一般要重写的方法有:
Start document //开始解析时的事件
startElement(String uri, String localName, String qName, Attributes attr) //遇到一个元素的开始时的事件
characters( char[] chars, int start, int length ) //遇到的文本。start表示文本在数组chars中的开始位置,length表示文本的长度
endElement(String uri, String localName, String qName) //遇到元素结束标记时的事件
对于下面的XML
<?xml version="1.0" encoding="gb2312"?>
<student>
<person age="25"><!--如果没有age属性,默认的为20-->
<name>崔卫兵</name>
<college>PC学院</college>
<telephone>62354666</telephone>
<notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
</person>
<person>
<name>cwb</name>
<college leader="leader1">PC学院</college><!--如果没有leader属性,默
认的为leader-->
<telephone>62358888</telephone>
<notes>男,1987年生,硕士,现就读于中国农业大学</notes>
</person>
<person age="45">
<name>xxxxx</name>
<college leader="学院领导">xxx学院</college>
<telephone>66666666</telephone>
<notes>注视中,注释中</notes>
</person>
</student>
通过下面的程序解析后,可以把每个标签中的内容提取出
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

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

import java.io.*;


public class TestSAX extends DefaultHandler
{


public TestSAX()
{
super();
}

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

/**//*if(qName.equalsIgnoreCase("person")){
String age=atts.getValue("age");
if(age!=null)
System.out.println("age: "+age);
else System.out.println("age: 20");
}
else if(qName.equalsIgnoreCase("name")){
tagName="name";
}
else if(qName.equalsIgnoreCase("college")){
tagName="college";
}
else if(qName.equalsIgnoreCase("telephone")){
tagName="telephone";
}
else if(qName.equalsIgnoreCase("notes")){
tagName="notes";
}*/

if("person".equals(qName))
{
String age=atts.getValue("age");
if(age!=null)
System.out.println("age: "+age);
else System.out.println("age: 20");
}
if("name".equals(qName) || "college".equals(qName) || "telephone".equals(qName) || "notes".equals(qName))
tagName=qName;
}

public void characters(char[] ch, int start, int length)throws SAXException
{
String text=new String(ch,start,length);

/**//*if(tagName.equals("name")) System.out.println("name: "+text);
else if(tagName.equals("college")) System.out.println("college: "+text);
else if(tagName.equals("telephone")) System.out.println("telephone: "+text);
else if(tagName.equals("notes")) System.out.println("notes: "+text);*/

if("name".equals(tagName))
{
System.out.println("name: "+text);
}

else if("college".equals(tagName))
{
System.out.println("college: "+text);
}

else if("telephone".equals(tagName))
{
System.out.println("telephone: "+text);
}

else if("notes".equals(tagName))
{
System.out.println("notes: "+text);
}
tagName=null;
}
private String tagName=null;

public static void main(String[] args)
{
// TODO Auto-generated method stub

try
{
TestSAX testSAX=new TestSAX();
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
parser.parse(new File("E:/我的文档/tmp/test.xml"), testSAX);
}

catch(IOException e)
{
e.printStackTrace();

}catch(SAXException e)
{
e.printStackTrace();

}catch(Exception e)
{
e.printStackTrace();
}
}

}

注意程序中注释的内容,它本来与外面的代码按说是等价的,但是如果用注释里面的代码就会出错。或许是因为当参数为null时,也会触发startElement和characters事件,这样,在空的string对象上调用equals就会出错