2012-12-17 monday suny
1、Sax解析:优势,解析速度快,占用资源少,不足是不能进行增删改。
通过事件触发的方式,不需要加载整篇文档,解析器解析到xml的每个组成部分都会触发不同的方法
在解析文档之前,需要实现绑定事件处理器
1、 解析xml文件,通过工厂类SAXParser获取解析器
2、 获得内部读取器Reader
3、 绑定内容管理器setContentHandler()
4、 读取xml文件
5、 实现接口类ContenHandlerde 的方法startElenment、character、element等需要的方法
public class Test1 {
@Test
public void test1() throws Exception {
// 解析 xml 文件
// 通过工厂类获得解析器
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
// 获得内部读取器Reader
XMLReader xmlReader = saxParser.getXMLReader();
// 绑定内容处理器
xmlReader.setContentHandler(new MyContentHandler());
// 读取xml文件
xmlReader.parse("src/book.xml");
}
@Test
public void test2() throws Exception {
// 解析 xml 文件 获得第一本书的书名
// 通过工厂类获得解析器
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
// 获得内部读取器Reader
XMLReader xmlReader = saxParser.getXMLReader();
// 绑定内容处理器
xmlReader.setContentHandler(new DefaultHandler() {
private boolean isDo = false;
private int num = 0;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
// 判断是否读到了 <书名> 开始标签
if("书名".equals(qName)) {
isDo = true;
num++;
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(isDo && num==2)
System.out.print(new String(ch, start, length));
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// 判断是否读到了 </书名> 结束标签
if("书名".equals(qName)) {
isDo = false;
}
}
});
// 读取xml文件
xmlReader.parse("src/book.xml");
}
}
class MyContentHandler implements ContentHandler { //实现接口类ContentHandler
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
// 读到了开始标签
System.out.print("<" + qName + ">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// 读到了文本内容
String data = new String(ch, start, length);
System.out.print(data);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// 读到了结束标签
System.out.print("</" + qName + ">");
}