import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
public class RSSHandler extends DefaultHandler {
static int cur=-1;
/**
* characters回调函数:当解析到一个节点后就会调用这个函数来接收节点后面的数据,例如<name>数据</name>,解析完<name>节点后调用该函数接受节点后面的数据
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO 自动生成的方法存根
super.characters(ch, start, length);
String str=new String(ch,start,length);
switch(cur)
{
case 2:
System.out.print(str+" ");
break;
case 3:
System.out.print(str+" ");
break;
case 4:
break;
default:
break;
}
}
/**
* endDocument函数:解析完一个文档后会调用改函数,且只调用一次
*/
public void endDocument() throws SAXException {
// TODO 自动生成的方法存根
super.endDocument();
System.out.println("解析已经结束");
}
/**
* endElement函数:当解析完一个节点后会调用该函数,例如<name>数据</name>,解析到</name>节点后就调用该函数
* qName:节点的名字相当于DOM中的getNodeName()
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO 自动生成的方法存根
super.endElement(uri, localName, qName);
System.out.println(qName+"节点解析完成");
cur=-1;
}
/**
* error:解析时遇到错误会调用改函数
*/
public void error(SAXParseException e) throws SAXException {
// TODO 自动生成的方法存根
super.error(e);
System.out.println("解析出错");
}
/**
* 当开始解析文档时最先调用该函数,且只调用一次
*/
public void startDocument() throws SAXException {
// TODO 自动生成的方法存根
super.startDocument();
System.out.println("解析已经开始");
}
/**
* startElement函数:当开始解析一个节点时会调用该函数,例如<name>数据</name>,解析到<name>节点后就调用该函数
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO 自动生成的方法存根
super.startElement(uri, localName, qName, attributes);
if(qName.equals("Books")){
System.out.println("图书如下:");
cur=0;
}
if(qName.equals("Book")){
System.out.println("Book:");
System.out.println(attributes.getLocalName(0)+":"+attributes.getValue(0));
cur=1;
}
else if(qName.equals("name")){
System.out.print("name:");
cur=2;
}
else if(qName.equals("price")){
System.out.print("price:");
cur=3;
}else{
System.out.print("文本元素:");
cur=4;
}
}
}
<pre class="java" name="code"> public static void SAX(File file){
RSSHandler handler=new RSSHandler();
SAXParserFactory factory=SAXParserFactory.newInstance();
try {
SAXParser paser=factory.newSAXParser();
paser.parse(file, handler);
} catch (ParserConfigurationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (SAXException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
<pre class="html" name="code"><?xml version="1.0" encoding="UTF-8"?>
<Books>textElement1
<Book id="1">
<name>Java Thinking</name>
<price>100.0</price>
</Book>
textElement2
<Book id="2">
<name>C++ Thinking</name>
<price>200.0</price>
</Book>
textElement3
</Books>
<pre class="plain" name="code">运行结果:(节点之外的数据没有处理例如<Books> <Book>之间的文本元素</Book> <Book>之间的文本元素,</Book> </Books>之间的文本元素)
解析已经开始
图书如下:
文本元素:Book:
id:1
name:Java Thinking name节点解析完成
price:100.0 price节点解析完成
Book节点解析完成
Book:
id:2
name:C++ Thinking name节点解析完成
price:200.0 price节点解析完成
Book节点解析完成
Books节点解析完成
解析已经结束