DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢

SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解析,同时根据已经定义好的事件处理器,来决定当前所解析的部分是否有必要进行记录并存储

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxParser{
public static void main(){
      File xmlFile = new File("E:\\article.xml");
      SAXParserFactory factory = SAXParserFactory.newInstance();
      try{
             SAXParser parser = factory.newSAXParser();
             parser.parse(xmlFile,newMySaxHandler());
      }catch(Exception e){
             e.printstacktrace();
      }
}
}

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MySaxHandler extends DefaultHandler{
      static DateFormat formater = newSimpleDateFormat("yyyy-MM-dd");
      private String content;

//覆写DefaultHandler中的charaters方法,接收元素中字符数据的通知,在执行完startElement或endElement方法后都会执行此操作
      @Override
      publicvoid charaters(char[] ch, int start, int length) throws SAXException{
             content = newString(ch,start,length);
      }
//当解析到元素的结束标签时触发
      @Override
      publicvoid endElement(String uri,String localName, String qName) throws SAXException{
      if("title".equals(qName))
             System.out.println("标题:"+ content);
      else if("author".equals(qName))
             System.out.println("作者:"+ content);
      else if("email".equals(qName))
             System.out.println("电子邮件:"+ content);
      else if("date".equals(qName))
             System.out.println("日期:"+ content);
      }
//当解析到元素的开始标签时触发
      @Override
      publicvoid startElement(String uri,String localName, String qName Attitudesattributes) throws SAXException{
             if("article".equals(qName)){
             System.out.println("所属分类:"+ attributes.getValue("category"));
             }
      }
}

DefaultHandler类

在解析XML数据时,要创建一个解析时的监听对象,一般可通过继承DefaultHandler类实现

void characters(char[] ch, int start, int length)

接收元素中字符数据的通知。

void endDocument()

接收文档结束的通知。

void endElement(String uri, String localName,String qName)

接收元素结束的通知。

void endPrefixMapping(String prefix)

接收名称空间映射结束的通知。

void error(SAXParseException e)

接收可恢复的解析器错误的通知。

void fatalError(SAXParseException e)

报告严重的 XML 解析错误。

void ignorableWhitespace(char[] ch, int start,int length)

接收元素内容中可忽略空白的通知。

void notationDecl(String name, StringpublicId, String systemId)

接收注释声明的通知。

void processingInstruction(String target,String data)

接收处理指令的通知。

InputSource resolveEntity(String publicId,String systemId)

解析外部实体。

void setDocumentLocator(Locator locator)

接收文档事件的 Locator 对象。

void skippedEntity(String name)

接收跳过的实体的通知。

void startDocument()

接收文档开始的通知。

void startElement(String uri, StringlocalName, String qName, Attributes attributes)

接收元素开始的通知。

uri - 名称空间 URI,如果元素没有任何名称空间URI,或者没有正在执行名称空间处理,则为空字符串。

localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。

qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。

attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。

void startPrefixMapping(String prefix, Stringuri)

接收名称空间映射开始的通知。

void unparsedEntityDecl(String name, StringpublicId, String systemId, String notationName)

接收未解析实体声明的通知。

void warning(SAXParseException e)

接收解析器警告的通知。

Attributes

int getIndex(String qName)

通过 XML 限定(前缀)名查找属性的索引。

int getIndex(String uri, String localName)

通过名称空间的名称查找属性的索引。

int getLength()

返回此列表中的属性个数。

String getLocalName(int index)

通过索引查找属性的本地名称。

String getQName(int index)

通过索引查找属性的 XML 限定(前缀)名。

String getType(int index)

通过索引查找属性的类型。

String getType(String qName)

通过 XML 限定(前缀)名查找属性的类型。

String getType(String uri, String localName)

根据名称空间的名称查找属性的类型。

String getURI(int index)

通过索引查找属性的名称空间 URI。

String getValue(int index)

通过索引查找属性的值。

String getValue(String qName)

通过 XML 限定(前缀)名查找属性的值。

String getValue(String uri, String localName)

根据名称空间的名称查找属性的值。

XML之SAX解析模型的更多相关文章

  1. xml的SAX解析和dom解析的区别

    一,区别 DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 ...

  2. xml的SAX解析规则

    一,为什么要用它 1.1,讲解 DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树. 对内存要求比较要. 缺点: 不适合读取大容量的xml文件,容易导致内存溢出. SAX ...

  3. 【文件处理】xml 文件 SAX解析

    SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档 ...

  4. Android解析XML之SAX解析器

    SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...

  5. xml——dom&sax解析、DTD&schema约束

    dom解析实例: 优点:增删改查一些元素等东西方便 缺点:内存消耗太大,如果文档太大,可能会导致内存溢出 sax解析: 优点:内存压力小 缺点:增删改比较复杂 当我们运行的java程序需要的内存比较大 ...

  6. 使用jaxp对比xml进行SAX解析

    package cn.itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationExcep ...

  7. XML之DOM解析模型

    <?xml version= "1.0" encoding = "UTF-8"> <articles> <article cate ...

  8. JavaWeb学习笔记——XML和SAX解析区别

  9. XML.03-DOM和SAX解析

    body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和 ...

随机推荐

  1. [NOI 2011]道路修建

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...

  2. [Codeforces 873B]Balanced Substring

    Description You are given a string s consisting only of characters 0 and 1. A substring [l, r] of s  ...

  3. UVA1658:Admiral

    题意:给定一个有向带权图,求两条不相交(无公共点)的路径且路径权值之和最小,路径由1到v 题解:这题的关键就在于每个点只能走一遍,于是我们想到以边换点的思想,用边来代替点,怎么代替呢? 把i拆成i和i ...

  4. C++Primer学习——未定义行为

    定义: 主要是求值顺序的问题 int i = f1() + f2();          //我们无法知道是f1 还是 f2先被调用 而且求值顺序和优先级和结合律无关,比如: f() + g()*h( ...

  5. 51 nod 1406 与查询

    1406 与查询 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有n个整数.输出他之中和x相与之后结果为x的有多少个.x从0 ...

  6. POJ 3233 (矩阵)

    题意:对于矩阵A,求A^1 + ...... + A^k 按照矩阵十大经典题的思路大致做了下. 在k为奇数时:  A^( k / 2+1)+ 1) * (A^1 + ....... A^(k/2)) ...

  7. 【SDOI2009】学校食堂

    Description 小F的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用 ...

  8. PHP 扩展开发检测清单(扩展开发必读)

    想要做出一个成功的 PHP 扩展包,不仅仅是简单的将代码放进文件夹中就可以了,除此之外,还有非常多的因素来决定你的扩展是否优秀.以下清单的内容将有助于完善你的扩展,并且在 PHP 社区中得到更多的重视 ...

  9. mvn package 和 mvn install

    刚刚准备将maven项目中一个子项目打个包,使用了mvn package.心想这个很简单嘛,没料就报错了.报错咱不怕,看看错在哪就好了. 编译出错,找不到我定义的异常类中的配置.那应该是引用父模块出来 ...

  10. PTA 邻接表存储图的广度优先遍历(20 分)

    6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ...