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 localName,String qName);读到结束标签时调用
======DOM解析 VS SAX解析======
DOM解析
原理:一次性加载XML文档,不适合大容量文件读取;
DOM解析可以任意进行增删改查
DOM解析任意读取任何位置的数据,甚至往回读
DOM解析面向对象的编程方法(Node,Element,Attribute)Java开发者编译比较简单
SAX解析
原理:加载一点,读取一点,处理一点。适合大容量文件读取
SAX解析只能读取
SAX解析只能从上往下,按顺序读取,不能往回读
SAX解析基于事件的编译方法,Java开发编译相对复杂
实现的功能:使用SAX读取contact.xml文件:
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, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("MyDefaultHandler.startElement()-->"+qName);
}
/*
* 结束标签时调用
* @param qName:结束标签的标签名称
*/
@Override
public void endElement(String uri, String localName, 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());
}
}
标签:XML,xml,String,--,SAX,解析,读取 From: https://blog.51cto.com/u_16079508/6207013