SAX 和 STAX 都是 基于事件驱动 —– SAX推模式 STAX拉模式
SAX常用事件
startDocument() —- 文档开始事件
startElemen() —- 元素开始事件
characters() —- 文本元素事件
endElement() —- 元素结束事件
endDocument() —– 文档结束事件
为什么说SAX是推模式解析? 解析器控制xml文件解析,由解析器调用相应事件方法
在startElemen() endElement() 获得 开始和结束元素名称
在characters() 获得读取到文本内容
在startElemen() 读取属性值
STAX 拉模式xml 解析方式 —– 客户端程序,自己控制xml事件,主动调用相应事件方法
<?xml version="1.0" encoding="UTF-8"?>
<config>
<server id="ws01">UNIX</server>
</config>
package com.qddx;
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 SAXTest {
public static void main(String[] args) throws Exception {
// 工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 通过工厂获得解析器
SAXParser parser = factory.newSAXParser();
// 创建Handler
MyHandler handler = new MyHandler();
// 将XML文档和handler 同时传递给解析器
parser.parse("server.xml", handler);
}
}
/**
*
* 继承default 重写5个事件方法
*
*/
class MyHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
System.out.println(" start document...");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println(" start Element..." + qName);
// 打印server 元素id 属性--判断当前开始元素是server
if (qName.equals("server")) {
System.out.println("id属性的值" + attributes.getValue("id"));
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String content = new String(ch, start, length);
System.out.println(" start characters..." + content);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println(" end endElement..." + qName);
}
@Override
public void endDocument() throws SAXException {
System.out.println(" end document...");
}
}