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就会出错