3、SAX的常用接口介绍
编辑
ContentHandler接口
ContentHandler是Java类包中一个特殊的SAX接口,位于
org.xml.sax包中。该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
ContentHandler接口的方法有以下几种:
void startDocument()
void endDocument()
void startElement(String uri,String localName,String qName,Attributes atts)
void endElement(String uri,String qName)
void characters(char[ ] ch,int start,int length)
DTDHandler接口
DTDHandler用于接收基本的DTD相关事件的通知。该接口位于
org.xml.sax包中。此接口仅包括DTD事件的注释和未解析的实体声明部分。
SAX解析器可按任何顺序报告这些事件,而不管声明注释和未解析实体时所采用的顺序;但是,必须在文档处理程序的startDocument()事件之后,在第一个startElement()事件之前报告所有的DTD事件。
DTDHandler接口包括以下两个方法
void startDocumevoid notationDecl(String name,String publicId,String systemId) nt()
void unparsedEntityDecl(String name,String systemId,String notationName)
EntityResolver接口
EntityResolver接口是用于解析实体的基本接口,该接口位于org.xml.sax包中。
该接口只有一个方法,如下:
public InputSource resolveEntity(String publicId,String systemId)
解析器将在打开任何外部实体前调用此方法。此类实体包括在DTD内引用的外部DTD子集和外部参数实体和在文档元素内引用的外部通用实体等。如果SAX应用程序需要实现自定义处理外部实体,则必须实现此接口。
ErrorHandler接口
ErrorHandler接口是SAX错误处理程序的基本接口。如果SAX应用程序需要实现自定义的错误处理,则它必须实现此接口,然后解析器将通过此接口报告所有的错误和警告。
该接口的方法如下:
void error(SAXParseException exception)
void fatalError(SAXParseException exception)
void warning(SAXParseException exception)
创建SAX解析器
(1)用系统默认值来创建一个XMLReader(解析器):
XMLReader reader = XMLReaderFactory.createXMLReader();
(2)从给定的类名称来创建一个XMLReader :
XMLReader reader = XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
(3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建:
SAXParserFactory spFactory = SAXParserFactory.newInstance();
SAXParser sParser = spFactory.newSAXParser();
DefaultHandler类
DefaultHandler类是SAX2事件处理程序的默认基类。它实现了EntityResolver、DTDHandler、ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法。如下:
XMLReader接口
XMLReader接口是使用回调读取XML文档的接口。XMLReader是XML解析器的SAX2驱动程序必须实现的接口。此接口允许应用程序设置和查询解析器中的功能和属性,注册文档的事件处理程序,以及对文档的解析。如下:
package org.dom4j.yeyi.parse;
import java.io.IOException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class TestXMLReader {
public TestXMLReader() {
try {
XMLReader reader = XMLReaderFactory
.createXMLReader("org.apache.xerces.parsers.SAXParser");
System.out.println("创建解析器成功!");
// MyContentHandler是实现了ContentHandler接口的类
reader.setContentHandler(new MyContentHandler<span style="widows: auto; font-family: arial,sans-serif;">());</span>
reader.setDTDHandler(new MyDTDHandler());
// 对test.xml进行解析
reader.parse("test.xml");
System.out.println("解析完成!");
} catch (SAXException | IOException e) {
e.printStackTrace();
}
}
}