1.SAX解析XML文档的方式:
与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象。优点是可以很方便实现增删改操作。缺点是,如果文件过大,会造成内存溢出。而SAX方式解析XML是采用事件驱动,边读便解析:从上到下,一行一行的解析,解析到某一个对象时,返回对象名称。优点是不会造成内存溢出,可以很方便实现查询操作,缺点是不能实现增删改操作。
2.在使用jaxp中的sax解析器之前,需要先获得sax解析器:
1)调用SAXParserFactory.newInstanse()方法得到创建SAX解析器的工厂
2)调用工厂对象的newSAXParse()方法得到saxParse解析器对象
3) 调用解析器对象的Parser()方法解析XML文档,该方法的参数有两个,XML文档所在路径和驱动事件对象。即: parse(File f, DefaultHandler dh)
或:parse(String url, DefaultHandler dh)
需要注意的是:在解析xml文档之前,我们需要自定义一个类,这个类继承自DefaultHandler,然后重写startElement()、characters()、endElement()这三个方法。
3.有如下XML文档
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <海贼王> <草帽海贼团> <船长>路飞</船长> <厨师>山治</厨师> <航海士>娜美</航海士> <船医>乔巴</船医> <音乐家>布鲁克</音乐家> <能力者>路飞</能力者> <能力者>乔巴</能力者> <能力者>布鲁克</能力者> </草帽海贼团> <草帽海贼团> <副船长>索隆</副船长> <考古学家>罗宾</考古学家> <狙击手>乌索普</狙击手> <船工>弗兰奇</船工> <能力者>罗宾</能力者> </草帽海贼团> </海贼王>
需求:获得第一个<能力者>标签的内容
代码如下:
package cn.roger.Jaxp; 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; /* * 使用Jaxp中的sax解析XML文档 */ public class SaxTest1 { public static void main(String[] args) throws Exception { // 创建解析器 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); //创建事件驱动 MyHandler dh = new MyHandler(); parser.parse("src/OnePiece.xml", dh); } } class MyHandler extends DefaultHandler { boolean flag = false; int index = 0; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equals("能力者")) { flag = true; index++; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (flag && index == 1) { System.out.println(new String(ch, start, length)); flag = false; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // System.out.print("</" + qName + ">"); } }
运行结果: