java中用sax解析xml

来源:互联网 发布:淘宝风云团队2017 编辑:程序博客网 时间:2024/06/05 18:26

SAX解析

在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构建代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,严重情况下可能还会导致内存溢出。

SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

通过继承DefaultHandler ,来开发一个sax解析器

SAX解析机制

sax是一种推式的机制,你创建一个sax 解析器,解析器在发现xml文档中的内容时就告诉你(把事件推给你). 如何处理这些内容,由程序员自己决定。

在基于sax 的程序中,有五个最常用sax事件

startDocument() ----> 告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档.

endDocument() ---> 告诉你解析器发现了文档尾

startElement()------>  告诉你解析器发现了一个起始标签,该事件告诉你元素的名称,该元素所有的属性名和值.

character() -----> 告诉你解析器发现了一些文本,将得到一个字符数组该数组的偏移量和一个长度变量,有这三个变量你可以得到解析器所发现的文本.

endElement()-----> 告诉你解析器发现了一个结束标签,该事件告诉你元素的名称

SAX解析

SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:

解析器可以使用JAXPAPI创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。

解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

SAX方式解析XML文档

使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf = SAXParserFactory.newInstance();

通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();

将解析对象和事件处理器对象关联

 sp.parse("src/myClass.xml", new MyHander());

sax技术的案例:

package com.sax.test;

import javax.xml.parsers.*;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class Sax1 {

//使用sax技术去解析xml文件.myclasses2.xml

public static void main(String[] args) throws Exception, SAXException {

// TODO Auto-generated method stub

//1.创建SaxParserFactory

SAXParserFactory spf=SAXParserFactory.newInstance();

//2.创建SaxParser 解析器

SAXParser saxParser=spf.newSAXParser();

//3 xml文件和事件处理对象关联

saxParser.parse("src/myclasses2.xml",new MyDefaultHandler2() );

}

}

//请思考,如何只显示学生的名字和年龄

class MyDefaultHandler2 extends DefaultHandler{

private boolean isName=false;

private boolean isAge=false;

@Override

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

throws SAXException {

// TODO Auto-generated method stub

String 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);

}

@Override

public void endDocument() throws SAXException {

// TODO Auto-generated method stub

super.endDocument();

}

@Override

public void endElement(String uri, String localName, String name)

throws SAXException {

// TODO Auto-generated method stub

super.endElement(uri, localName, name);

}

@Override

public void startDocument() throws SAXException {

// TODO Auto-generated method stub

super.startDocument();

}

@Override

public void startElement(String uri, String localName, String name,

Attributes attributes) throws SAXException {

// TODO Auto-generated method stub

if(name.equals("名字")){

this.isName=true;

}else if(name.equals("年龄")){

this.isAge=true;

}

}

}

//定义事件处理类

class MyDefaultHandler1 extends DefaultHandler{

//发现文档开始

@Override

public void startDocument() throws SAXException {

// TODO Auto-generated method stub

System.out.println("startDocument()");

super.startDocument();

}

//发现xml文件中的一个元素

@Override

public void startElement(String uri, String localName, String name,

Attributes attributes) throws SAXException {

// TODO Auto-generated method stub

System.out.println("元素名称="+name);

}

//发现xml文件中的文本

@Override

public 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>

@Override

public void endElement(String uri, String localName, String name)

throws SAXException {

// TODO Auto-generated method stub

super.endElement(uri, localName, name);

}

//发现文档结束

@Override

public void endDocument() throws SAXException {

// TODO Auto-generated method stub

System.out.println("endDocument()");

super.endDocument();

}

}

sax说明:

1. sax主要用于对xml文件解析(读取),不能去修改,删除,添加元素

2. sax 是推机制,把发现的内容告诉程序员(函数),程序员可以自己决定如何处理