SAX的基本知识:
XML的SAX解析:
DOM解析原理:一次性把XML文档加载进内存,然后在内存中构建Document树,对内存要求比较高。
DOM解析缺点:不适合读取大容量的XML文件,容易导致内存溢出。
SAX解析原理:加载一点,读取一点,处理一点,对内存要求比较低。
SAX解析工具:Sun公司提供的。内置在jdk中。org.xml.sax.*
核心的API:
SAXParser类:用于读取和解析XML文件对象
parse(File 飞,DefaultHandler dh)方法;解析XML文件
参数一:File:表示读取的XML文件
参数二:DefaultHandler:SAX事件的处理程序。使用DefaultHandler的子类
DefaultHandler类的API:
void startDocument() : 在读到文档开始时调用
void endDocument() :在读取文档结束时调用
void startElement(String url,String localName,String qName,Attributes attributes):读到开始标签是调用
void endElement(String url,String qName);读到结束标签时调用
======DOM解析 VS SAX解析======
DOM解析
原理:一次性加载XML文档,不适合大容量文件读取;
DOM解析可以任意进行增删改查
DOM解析任意读取任何位置的数据,甚至往回读
DOM解析面向对象的编程方法(Node,Element,Attribute)Java开发者编译比较简单
SAX解析
原理:加载一点,读取一点,处理一点。适合大容量文件读取
SAX解析只能读取
SAX解析只能从上往下,按顺序读取,不能往回读
SAX解析基于事件的编译方法,Java开发编译相对复杂
XML文件:contact.xml
<?xml version="1.0" encoding="utf-8"?> <contactList> <contact id="001" name="eric"> <name>张三</name> <age>20</age> <phone>134222223333</phone> <email>zhangsan@qq.com</email> <qq>432221111</qq> </contact> <contact id="002" name="jacky"> <name>eric</name> <age>20</age> <phone>134222225555</phone> <email>lisi@qq.com</email> <qq>432222222</qq> </contact> </contactList>
实现功能的处理程序:MyDefaultHandler.java
package SAX; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /* * SAX处理程序(如何解析XML文件) */ public class MyDefaultHandler extends DefaultHandler { /* * 开始文档时调用 */ @Override public void startDocument() throws SAXException { System.out.println("MyDefaultHandler.startDocument()"); } /* *开始标签时调用 *@param qName:表示开始标签的标签名 *@param attributes :表示开始镖旗内包含的属性列表 */ @Override public void startElement(String uri,Attributes attributes) throws SAXException { System.out.println("MyDefaultHandler.startElement()-->"+qName); } /* * 结束标签时调用 * @param qName:结束标签的标签名称 */ @Override public void endElement(String uri,String qName) throws SAXException { System.out.println("MyDefaultHandler.endElement()-->"+qName); } /* * 读到文本内容时调用 * @param ch: 表示当前读完的所有文本内容 * @param start: 表示当前文本内容的开始位置 * @param length: 表示当前文本内容的长度 */ @Override public void characters(char[] ch,int start,int length) throws SAXException { //得到当前文本内容 String content = new String(ch,start,length); System.out.println("MyDefaultHandler.characters()-->"+content); } /* * 结束文档时调用 */ @Override public void endDocument() throws SAXException { System.out.println("MyDefaultHandler.endDocument()"); } }
实现的主程序:Demo_sax.java
package SAX; import java.io.File; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; /* * 第一个SAX读取XML文件程序 */ public class Demo_sax { public static void main(String[] args) throws Exception { //1.创建SAXParse对象 SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); //2.调用parse方法 参数一:XML文档;参数二:DefaultHandler的子类 parser.parse(new File("./src/contact.xml"),new MyDefaultHandler()); } }