XML编程-SAX
XML编程-SAX
基本概述
SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。
SAX是一个用于处理XML事件驱动的“推”模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API。SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。
PS:SAX不能够对XML文件进行修改,删除、添加操作。
为什么引入SAX技术?
DOM技术也是一种非常好的DOM解析方案,为什么还会出现SAX技术呢?原因很简单,那就是DOM是以文档树的结构对XML进行保存,这就表明是一次性将XML读入内存,那么这在大型的XML文件中是不可能的。所以才产生了SAX这种扫描解析的技术。
原理图
SAX解析机制
SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
在Java中,通过继承DefaultHandler 接口,可以开发一个SAX解析器。
SAX的解析机制和事件监听机制很像,都是等待某一事件触发,然后调用相应方法。
SAX解析器的最常用5个事件:
1、startDocument():这标识着SAX解析器扫描到文档开始位置。
2、endDocument(),这标识着SAX解析器扫描到文档的结束位置。
3、startElement(),这标识着SAX解析器扫描到一个元素的开始标签。
4、character(),这标识着SAX解析器扫描到了一些文本,注意它是以char数组形式存放的。
5、endElement(),这标识着SAX解析器扫描到了一个元素的结束标签。
事件处理器常用方法参数列表
public void startDocument()
public void startElement(String uri, String localName, String qName,Attributes attributes)
uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
public void characters(char[] ch, int start, int length)
ch - 文档的所有字符。
start - 字符数组中的开始位置。
length - 从字符数组中使用的字符数。
public void endElement(String uri, String localName, String qName)
uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
public void endDocument()
解析方式
通过解析器和事件处理器一起使用,可以解析XML文档。解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
解析步骤
1、通过调用SAXParserFactory的newInstance()方法获得Sax解析器工厂对象。
2、通过Sax解析器工厂对象调用newSAXParser()方法获得解析器SAXParser对象
3、通过调用解析器对象的parse方法将解析器与事件处理器对象关联
案例:
XML6.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><班级 班次="1班" 编号="C1"><学生 地址="湖南" 学号="n1" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1"><名字>张三</名字><年龄>20</年龄><介绍>不错</介绍></学生><学生 学号="n2" 性别="女" 授课方式="面授" 朋友="n1 n3" 班级编号="C1"><名字>李四</名字><年龄>18</年龄><介绍>很好</介绍></学生><学生 学号="n3" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1"><名字>王五</名字><年龄>22</年龄><介绍>非常好</介绍></学生><学生 性别="男"><名字>小明</名字><年龄>30</年龄><介绍>好</介绍></学生></班级>
package com.pc;import javax.xml.parsers.*;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class XML6{//使用sax技术去解析xml文件public static void main(String[] args) throws Exception, SAXException {// TODO Auto-generated method stub//1.创建SaxParserFactorySAXParserFactory spf=SAXParserFactory.newInstance();//2.创建SaxParser 解析器SAXParser saxParser=spf.newSAXParser();//3 把xml文件和事件处理对象关联saxParser.parse("src/com/pc/XML6.xml",new MyDefaultHandler2() );}}// 只显示学生的名字和年龄class MyDefaultHandler2 extends DefaultHandler{private boolean isName=false;private boolean isAge=false;@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubString con=new String(ch,start,length);if(!con.trim().equals("")&&(isName||isAge)){System.out.println(con);}isName=false;isAge=false;//super.characters(ch, start, length);}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubsuper.endDocument();}@Overridepublic void endElement(String uri, String localName, String name)throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, name);}@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stubsuper.startDocument();}@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {// TODO Auto-generated method stubif(name.equals("名字")){this.isName=true;}else if(name.equals("年龄")){this.isAge=true;}}}//定义事件处理类class MyDefaultHandler1 extends DefaultHandler{//发现文档开始@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("startDocument()");super.startDocument();}//发现xml文件中的一个元素@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {// TODO Auto-generated method stubSystem.out.println("元素名称="+name);}//发现xml文件中的文本@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {String con=new String(ch,start,length);//显示文本内容:if(!con.trim().equals("")){System.out.println(new String(ch,start,length));}}//发现xml文件中一个元素介绍</xx>@Overridepublic void endElement(String uri, String localName, String name)throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, name);}//发现文档结束@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("endDocument()");super.endDocument();}}
以上就是XML编程-SAX 的内容,更多相关内容请关注PHP中文网(www.php.cn)!
更多相关文章
- xml学习(2)xml文档树结构图
- 灵活调用xsl来解析xml文档(js异步)
- 从xml中获取城市,省份名称
- 如何得到XML文档大小的详细介绍
- XML文档搜索使用小结
- XML—尝试对一个XML文档进行增删查改编程的详解
- 详解通过XmlDocument读写Xml文档的示例代码
- XML中的树形结构与DOM文档对象模型的示例代码(图)
- XSLT语法—在.net中使用XSLT转换xml文档的示例代码详解