Java解析xml——SAX解析

一、Dom解析 VS SAX解析

Dom解析是将整个xml文件加载到内存中,然后再进行相关的操作。

SAX解析是依次读取xml文件的内容,逐个解析。


二、SAX解析实例

books.xml:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book id="1">
		<name>冰与火之歌</name>
		<author>乔治马丁</author>
		<time>2014</time>
		<price>89</price>
	</book>
	<book id="2">
		<name>安徒生童话</name>
		<price>40</price>
		<time>2004</time>
		<language>English</language>
	</book>
</bookstore>

SaxDemo.java

public class SaxDemo {

	public static void main(String[] args) {
		//1、创建SAXParserFactory实例
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			//2、创建SAXParser实例
			SAXParser parser = factory.newSAXParser();
			//3、新建一个类SAXHandler继承DefaultHandler,重写其中的一些方法用来进行业务处理。
			//再创建一个SAXHandler对象
			SAXHandler handler = new SAXHandler();
			//4、进行解析,传入SAXHandler对象作为解析xml的处理类
			parser.parse("xml/books.xml", handler);
			
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
SAXHandler.java

public class SAXHandler extends DefaultHandler {

	int bookIndex = 0;
	
	/**
	 * 开始解析xml文件
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		
		System.out.println("开始解析xml文件");
	}
	
	/**
	 * 解析xml文件结束
	 */
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
		
		System.out.println("解析xml文件结束");
	}
	
	/**
	 * 开始解析xml元素
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		
		//qName为标签名称
		if("book".equals(qName)) {
			bookIndex++;
			System.out.println("======开始解析第" + bookIndex + "本书======");
			//如果已知标签的属性,则可以直接调用Attributes.getValue(String name)获取属性值
			System.out.println("已知book已有id属性,获取属性值-->" + attributes.getValue("id"));
			
			//如果不知道标签的属性,则需要遍历Attributes分别获取属性名与属性值
			int len = attributes.getLength();
			System.out.println("book元素有" + len + "个属性");
			for(int i = 0; i < len; i++) {
				//通过Attributes.getQName(int index)获取属性名称
				System.out.print("获取book属性" + attributes.getQName(i));
				//通过Attributes.getValue(int index)获取属性值
				System.out.println(",属性值-->" + attributes.getValue(i));
			}
		} else if(!"books".equals(qName) && !"bookstore".equals(qName)) {
			System.out.print("解析到节点" + qName);
		}
	}
	
	/**
	 * 解析xml元素结束
	 */
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		super.endElement(uri, localName, qName);
		
		if("book".equals(qName)) {
			System.out.println("======解析第" + bookIndex + "本书结束======");
		}
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		super.characters(ch, start, length);
		//ch为整个xml文档的内容,start为当前标签内容所在位置,length为当前标签内容的长度
		//需要过滤掉空格和换行,SAX解析也会把空格和换行当做xml文档的内容
		String str = new String(ch, start, length);
		if(!"".equals(str.trim())) {
			System.out.println("-->节点值:" + str);
		}
	}
	
}

运行结果:

开始解析xml文件
======开始解析第1本书======
已知book已有id属性,获取属性值-->1
book元素有1个属性
获取book属性id,属性值-->1
解析到节点name-->节点值:冰与火之歌
解析到节点author-->节点值:乔治马丁
解析到节点time-->节点值:2014
解析到节点price-->节点值:89
======解析第1本书结束======
======开始解析第2本书======
已知book已有id属性,获取属性值-->2
book元素有1个属性
获取book属性id,属性值-->2
解析到节点name-->节点值:安徒生童话
解析到节点price-->节点值:40
解析到节点time-->节点值:2004
解析到节点language-->节点值:English
======解析第2本书结束======
解析xml文件结束

从运行结果可以看出SAX解析Handler处理顺序是:xml文件开头的startDocument-->所有节点startElement-->characters-->endElement-->文件末尾endDocument

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值