java sax解析_Java 解析xml 之 SAX解析

SAX是什么

SAX是一种快速读写XML数据的方式。

局限

1.SAX分析器在解析xml文档时,触发了一系列事件,因为事件本身是有时序性的。因此SAX一旦经过了某个元素,没有办法返回再去访问。

2.SAX分析器只事检查xml文档中的字节流,语法,然后触发相应事件。而处理函数本身则要由程序实现,相比DOM,SAX缺乏灵活性。

优势

SAX分析器实现简单,对内存要求比较低,因此实现小路比较高;对于大型的xml文档来说,通常会用SAX而不用DOM;对于那些只需要访问xml文档中的数据而不对文档进行更改的应用程序来说,SAX分析器更为合适。

SAX实例解析

Juny Of City

Juny

2011

15.99

Harry Potter

J K. Rowling

2005

29.99

解析过程

package sax;

import java.io.File;

import java.util.Stack;

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;

public class SaxTest2 {

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

// step 1: 获得SAX解析器工厂实例

SAXParserFactory factory = SAXParserFactory.newInstance();

// step 2: 获得SAX解析器的实例

SAXParser parser = factory.newSAXParser();

// step 3: 开始进行解析

// 传入待解析的文档的处理器

parser.parse(new File("books.xml"),new MySAXHandler());

}

}

class MySAXHandler extends DefaultHandler {

// 使用栈这个数据结构来保存

private Stack stack = new Stack();

// 数据

private String title;

private String author;

private String year;

private double price;

@Override

public void startDocument() throws SAXException {

System.out.println("start document-> parse begin");

}

@Override

public void endDocument() throws SAXException {

System.out.println("end document-> parse finished");

}

@Override

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

Attributes attributes) throws SAXException {

// 将标签名压入栈

stack.push(qName);

// 处理属性

for (int i = 0; i < attributes.getLength(); i++) {

String attrName = attributes.getQName(i);

String attrValue = attributes.getValue(i);

System.out.println("属性:" + attrName + ":" + attrValue);

}

}

@Override

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

throws SAXException {

// 取出标签名

String tag = stack.peek();

if ("title".equals(tag)) {

title = new String(ch, start, length);

} else if ("author".equals(tag)) {

author = new String(ch, start, length);

} else if ("year".equals(tag)) {

year = new String(ch, start, length);

} else if ("price".equals(tag)) {

price = Double.parseDouble(new String(ch, start, length));

}

}

@Override

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

throws SAXException {

stack.pop();//表示该元素解析完毕,需要从栈中弹出标签

if("book".equals(qName)){

System.out.println("Book info: -------");

System.out.println(" title: " + title);

System.out.println(" author: " + author);

System.out.println(" year: " + year);

System.out.println(" price: " + price);

System.out.println();

}

}

}

## 控制台输出 ##

start document-> parse begin

属性:category:man

属性:lang:en

Book info: -------

title: Juny Of City

author: Juny

year: 2011

price: 15.99

属性:category:children

属性:lang:en

Book info: -------

title: Harry Potter

author: J K. Rowling

year: 2005

price: 29.99

end document-> parse finished

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值