1、SAX 的概述
SAX,全称 Simple API for XML,是一种以事件驱动的 XMl API,SAX 与 DOM 不同的是它边扫描边解析,自顶向下依次解析。由于边扫描边解析,所以它具有速度快,占用内存少的优点。
2、SAX 解析 XML 的步骤
1) 创建 SAXParserFactory 的对象
2) 创建 SAXParser 对象 (解析器)
3) 创建一个 DefaultHandler 的子类,需要重写5个方法
//解析xml文档开始时调用
startDocument()
//解析xml文档结束时调用
endDocument()
//解析xml文档中的开始节点时调用
startElement(String uri, String localName, String qName, Attributes attributes)
//解析xml文档中的结束节点时调用
endElement(String uri, String localName, String qName)
//解析xml文档中的节点中的文本值时调用
characters(char[] ch, int start, int length)
4) 调用 parse 方法
3、SAX解析案例
DefaultHandler 子类:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class BookDefaultHandler extends DefaultHandler{
/** 解析xml文档开始时调用 */
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("------解析XML文档开始------");
}
/** 解析xml文档中的开始节点时调用 */
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
// System.out.println("解析XML文档的开始节点");
System.out.print("<" + qName + " ");
/* 判断:如果是book节点,获取节点的属性值 */
if(qName.equals("book")) {
//获取所有的属性
int count = attributes.getLength();
for (int i = 0; i < count; i++) {
String attrName = attributes.getQName(i);
String attrValue = attributes.getValue(i);
System.out.print(attrName + "="" + attrValue
+ "" ");
}
}
System.out.println(">");
}
/** 解析xml文档中的结束节点时调用 */
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("</" + qName + ">");
}
/** 解析xml文档中的节点中的文本值时调用 */
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
String value = new String(ch, start, length);
//去掉空白节点
if(!value.trim().equals("")) {
System.out.println(value);
}
}
/** 解析xml文档结束时调用 */
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("------解析XML文档结束------");
}
}
SAX解析测试类:
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class TestSAXParse {
public static void main(String[] args)
throws ParserConfigurationException, SAXException, IOException {
//1) 创建 SAXParserFactory 的对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//2) 创建 SAXParser 对象 (解析器)
SAXParser parser = factory.newSAXParser();
//3) 创建一个 DefaultHandler 的子类,需要重写5个方法
BookDefaultHandler bdh = new BookDefaultHandler();
//4) 调用 parse 方法
parser.parse("book.xml", bdh);
}
}
尚学堂百战程序员
百战程序员_IT6000集_影响6000万学习IT的中国人【官网】