SAX概述
DOM适合对文档增删改,会将整个文档加载到内存中
SAX适合小信息的处理,单遍解析,不支持随机访问
SAX的工作机制:
SAX解析器在加载XML,遍历XML文档并在其主机应用程序中产生事件。大多数SAX会实现以下几种类型的事件:
1.在文档的开始和结束时触发文档处理事件
2.在文档内每一个XML元素都在接受解析的前后触发事件。任何元数据通常都是由单个的事件交付。
3.在处理文档的DTD或Schema时产生DTD或Schema事件
4.错误事件用来通知主机应用程序解析错误
常用接口
Attributes接口
ContentHandler接口
DTDHandler接口
EntityResolver接口
XMLReader接口
SAX错误处理程序的基本接口
SAX解析XML文档
1.处理文件的开始和结束
2.处理指令
3.处理开始和结束的标记
4.处理文本数据
5.处理空白
6.处理命名空间
7.处理实体
8.SAX应用程序异常
package SAX;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class example {
public static void main(String[] args) {
try{
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser saxParser = factory.newSAXParser();
MyHandler handler = new MyHandler(new File("example.xml"));
saxParser.parse(new File("example.xml"), handler);
}catch(Exception e){
e.printStackTrace();
}
}
}
class MyHandler extends DefaultHandler{
File file;
long startTime,endTime;
public MyHandler(File f){
file = f;
}
//处理文件开始
public void startDocument(){
startTime = System.currentTimeMillis();
System.out.println("文件所在路径是"+file.getAbsolutePath());
System.out.println("文件名字是"+file.getName());
System.out.println("开始解析XML文件-----------");
}
//处理文件结束
public void endDocument(){
System.out.println("解析XML文件结束----------");
endTime=System.currentTimeMillis();
System.out.println("文件解析共花费"+(endTime-startTime)+" 秒");
}
//处理指令
public void processingInstruction(String target,String data){
System.out.println("处理的指令的名称是:"+target);
System.out.println("处理指令的内容是:"+data);
}
//处理开始标记
public void startElement(String uri,String localName , String qName , Attributes attributes)throws SAXException{
if(uri.length()>0){
System.out.println("uri::"+uri);
}
System.out.print("< "+ qName+" " );
for(int k=0;k<attributes.getLength();++k){
System.out.print(attributes.getLocalName(k)+"=");
System.out.print("\""+attributes.getValue(k)+"\"");
}
System.out.println(">");
}
//处理文本数据(包括了空格文本数据)
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String text=new String(ch,start,length);
System.out.println(text.trim());
}
//处理命名空间
@Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
System.out.println("前缀为: "+prefix);
System.out.println("命名空间的名称为 "+uri);
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
super.endPrefixMapping(prefix);
}
//处理结束标记
public void endElement(String uri,String localName,String qName)throws SAXException{
System.out.println("</"+qName+">");
}
}
SAX 过滤器:
1.一个SAX解析器可以拥有多个过滤器对象,不同的过滤器对象有不同的功能。如果一个解析器对象拥有多个过滤器对象,在解析的时候,把这些过滤器在次序上串接起来,XML文件中的事件首先传递给第一个过滤器,处理器把相应的内容做出更改之后,再把事件传递给下一个过滤器理器。事件经过多次处理之后,最后被传递给解析器的事件处理器。
2.要使用SAX过滤器除了需要ContentHandler、ErrorHanlder等接口以外,还需要XMLReader接口和XMLFilter接口。XMLReader接口可以对XML文件进行分析,并以回调的形式将分析得到的事件信息发送给相应的事件处理器。XMLFilter接口继承了XMLReader接口,XMLFilter接口的对象就是SAX过滤器。与XMLReader接口不同的是它不XMLReader那样通过解析XML文件来获取事件,而是从其它的XMLReader中或其它的XMLFilter中获取事件,XMLFilter中有两个方法:
类似于DefaultHandler类,xml.sax.helpers包中提供了XMLFilterImpl类,该类实现了XMLFilter、ContentHandler、ErrorHanlder等接口。通过
void setParent(XMLReader parent) :用于设定父XMLReader(或另一 XMLReader getParent() :用于获取父XMLReader(或另一个过滤器)。
个过滤器),