1.首先建立事件监听器类:
package com.wch.dom;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.xml.namespace.QName;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MySaxHandler extends DefaultHandler {
static DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
private String content;
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
content = new String(ch,start,length);
}
@Override
public void endElement(String uri, String localName, String aName)
throws SAXException {
// TODO Auto-generated method stub
if ("title".equals(aName)) {
System.out.println("标题:"+content);
}else
if ("author".equals(aName)) {
System.out.println("作者:"+content);
}else
if("email".equals(aName))
{
System.out.println("email:"+content);
}else
if("date".equals(aName))
{
System.out.println("date:"+content);
}
}
@Override
public void startElement(String uri, String localName, String aName,
Attributes attri) throws SAXException {
// TODO Auto-generated method stub
if("article".equals(aName))
{
System.out.println("\r\n找到第一篇文章,所属分类:"+attri.getValue("category"));
}
}
}
2.建立测试类:
package com.wch.dom;
import java.io.File;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.junit.Test;
import org.xml.sax.SAXException;
public class SaxXml {
@Test
public void test()
{
//创建解析XML的对象
File xmlFile = new File("E:/Eclipse1/DomXml/src/com/wch/xml/NewFile.xml");
//创建SAXParserFactory对象
SAXParserFactory sf = SAXParserFactory.newInstance();
try {
//创建SAXParser对象
SAXParser sp = sf.newSAXParser();
//解析文件,定义解析时的事件处理
sp.parse(xmlFile, new MySaxHandler());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
3.测试结果:
找到第一篇文章,所属分类:xml
标题:XML 概述
作者:janet
email:janetval@yahoo.com.cn
date:20080809
找到第一篇文章,所属分类:java
标题:Java书籍
作者:XXX君
email:XXXX@163.com
date:20100212
总结:SAX与DOM是两种功能差不多但是底层实现不太一样的解析方式。DOM在解析的时候会把整个XML文件全部映射为Document里的树状结构。对于小的XML文件使用还是挺方便的,但是遇到比较大的XML文件的时候,DOM的缺点就暴露了,它的内存占用较大,而且查找速度比较慢。
SAX就是针对这种情况出现的解决方案:SAX解析器对XML文档会从XML文档开发的位置进行解析,同时根据已经定义好的事件处理器来决定当前所解析的部分是否有必要记录并存储。SAX解析是事件驱动的,所以在解析XML文件的时候需要定义监听器对象(如上面的MySaxHandler)。