由于DOM解析需要先读取整个文件到内存再处理,所以如果文件较大的时候非常耗资源。
SAX解析解决了这个问题。
SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。
SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。
实现示例:
首先,同样一个Student类
package com.hb.xml; /** * Student节点 * * @author HuangBin * @2014年10月7日 */ public class Student { String name; String sex; int no; int num; public String toString() { return name + " " + sex + " " + no + " " + num; } }
1、 创建一个解析器工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
2、创建sax解析器
SAXParser sax = factory.newSAXParser();
3、创建DefaultHander对象
MyHander hander = new MyHander();// MyHander extends DefaultHander
4、进行解析
sax.parse(new FileInputStream(new File("student.xml")), hander);
MyHander定义如下:
class MyHander extends DefaultHandler { String strValue; public void startDocument() throws SAXException { // System.out.println("开始解析"); } public void endDocument() throws SAXException { // System.out.println("结束解析"); // 在结束解析的时候遍历打印 检查是否正确 for (Student stu : list) { System.out.println(stu); } } public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { // System.out.println("解析到一个元素:" + qName); if (qName.equals("stu")) { stu = new Student(); list.add(stu); String no = atts.getValue("no"); if (no != null) { stu.no = Integer.parseInt(no); } String num = atts.getValue("num"); if (num != null) { stu.num = Integer.parseInt(num); } } } public void endElement(String uri, String localName, String qName) throws SAXException { // System.out.println("元素结尾:" + qName); if (qName.equals("name")) { stu.name = strValue; } else if (qName.equals("sex")) { stu.sex = strValue; } } public void characters(char[] ch, int start, int length) throws SAXException { strValue = new String(ch, start, length); // System.out.println(new String(ch, start, length)); } }
在MyHander中,可以发现,DefaultHander其实就像一个鼠标监听器,也是一种事件处理器,在事件处理器中对其进行解析处理。这里用到了几个基本的。最后一个characters是得到了节点的文本内容。
完整代码:
package com.hb.xml; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; 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; /** * Sax解析 * * @author HuangBin * @2014年10月8日 */ public class SaxTest { public static ArrayList<Student> list = new ArrayList<Student>(); Student stu; public static void main(String[] args) throws Exception { new SaxTest().parse(); } public void parse() throws Exception { long long1 = System.currentTimeMillis(); // 创建一个解析器工厂对象 SAXParserFactory factory = SAXParserFactory.newInstance(); // 创建sax解析器 SAXParser sax = factory.newSAXParser(); MyHander hander = new MyHander(); sax.parse(new FileInputStream(new File("student.xml")), hander); long long2 = System.currentTimeMillis(); System.out.println(long2 - long1); // 经过对4048k的同一个文件测试,比DOM快4倍多。183/702ms } class MyHander extends DefaultHandler { String strValue; public void startDocument() throws SAXException { // System.out.println("开始解析"); } public void endDocument() throws SAXException { // System.out.println("结束解析"); // 在结束解析的时候遍历打印 检查是否正确 // for (Student stu : list) { // System.out.println(stu); // } } public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { // System.out.println("解析到一个元素:" + qName); if (qName.equals("stu")) { stu = new Student(); list.add(stu); String no = atts.getValue("no"); if (no != null) { stu.no = Integer.parseInt(no); } String num = atts.getValue("num"); if (num != null) { stu.num = Integer.parseInt(num); } } } public void endElement(String uri, String localName, String qName) throws SAXException { // System.out.println("元素结尾:" + qName); if (qName.equals("name")) { stu.name = strValue; } else if (qName.equals("sex")) { stu.sex = strValue; } } public void characters(char[] ch, int start, int length) throws SAXException { strValue = new String(ch, start, length); // System.out.println(new String(ch, start, length)); } } }
相关推荐
xml sax解析
xml
java xmlSAX 解析,简单易使用。
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
绝对可用的SAX解析XML文件项目,费了九牛二虎之力,才找到的好资源,特与大家共享出来。直接导入eclipse就可运行,无需任何配置。
Sax解析XML文件解
本代码是我对博客的xml解析----------Sax解析的代码重写了,一份,给需要的朋友,做参考。
Android SAX 解析XML SAX 解析XML(通用)
Java SAX解析Xml Demo(详细注释)
XML解析之SAX解析DEMO,之前在播控上有介绍,但是代码排版太乱了,这个就是Android4.0网络编程中的SAX解析例子。
Sax解析xml文件详细例子,解析复杂节点的xml,把内容显示到view中,例子简单完整,易用
SAX解析超大XML文件 示例代码 SAX解析超大XML文件 示例代码 SAX解析超大XML文件 示例代码
java学习笔记——使用DOM解析XML和使用SAX解析XML
Servlet利用SAX解析XML文档,JAX,JSWDP,Servlet利用SAX解析XML文档
XML通过SAX解析为JSON格式的文档 例子中的类稍微修改可以做做到公用
下面是一个SAX解析XML的示例(有点长,因为详细注解了SAX事件处理的所有方法),SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。下面的例子可能...
使用java语言对XML文档进行解析的示例,包括DOM,SAX方式,并包括使用jdom和jom4j框架进行XML解析或生成XML文档
sax解析XML方式的代码及特点,sax解析XML方式的代码及特点,sax解析XML方式的代码及特点,sax解析XML方式的代码及特点
Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有...
sax解析xml本地读取xml,希望对你有用