首页 > 其他 > 详细

XML文档的SAX解析

时间:2015-07-14 06:16:33      阅读:230      评论:0      收藏:0      [点我收藏+]

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<books> <!--根节点--><!--这里的空白也算一个节点,所以books共有5个子节点-->
	<book id="book1" w="wwwww">
		<name><a>AAAAAA</a>bookName1</name>
		<price>10.0</price>
	</book>
	<book id="book2">
		<name>bookName2</name>
		<author>bookAuthor2</author>
	</book>
</books>


测试类:

package com.zhang.xml.sax;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

/*
 * sax解析是逐行扫描文档,一边扫描一边解析。
 * 需要创建一个org.xml.sax.helpers.DefaultHandler的继承类
 */
public class SaxParse {

	public static void main(String[] args) throws Exception {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		
		SaxParser handler = new SaxParser();
		parser.parse("books.xml", handler);
		
		System.out.println(handler.getBooks());
	}

}


org.xml.sax.helpers.DefaultHandler的子类
package com.zhang.xml.sax;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.zhang.xml.bean.Book;

public class SaxParser extends DefaultHandler {
	
	private int index = 0;
	private List<Book> books = new ArrayList<Book>();
	private Book book = null;
	private String value = null;
	
	public List<Book> getBooks() {
		return books;
	}

	/**
	 * 用来标识解析开始
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		System.out.println("----------开始解析文档----------");
	}
	
	/**
	 * 用来标识解析结束
	 */
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
		System.out.println("----------结束文档解析----------");
	}
	
	/**
	 * 解析一个xml元素
	 * 每遇到一个元素的开始标签就调用一次该方法
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		if("book".equals(qName)){
			index++;
			System.out.println("---开始解析第" + index + "个book标签---");
			book = new Book();
			
			int size = attributes.getLength();
			for(int i=0; i<size; i++) {
				System.out.print("第" + (i + 1) + "个属性名: " + attributes.getQName(i));
				System.out.println("-->属性值:" + attributes.getValue(i));
				
				if("id".equals(attributes.getQName(i))) {
					book.setId(attributes.getValue(i));
				}
			}
		} else {
			System.out.println("遇到" + qName + "开始标签");			
		}
		
	}
	
	/**
	 * 结束一个解析xml元素
	 * 每遇到一个元素的结束标签就调用一次该方法
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		if("book".equals(qName)){
			System.out.println("---结束解析第" + index + "个book标签---");
			
			books.add(book);
			book = null;
		} else if("name".equals(qName)) {
			book.setName(value);			
		} else if("price".equals(qName)) {
			book.setPrice(value);			
		} else if("author".equals(qName)) {
			book.setAuthor(value);			
		} else {
			System.out.println("遇到" + qName + "结束标签");
		}
	}
	
	/*
	 *	ch中存放着xml文档中所有的元素的值,每遇到一个元素的值,就调用一次该方法
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		value = new String(ch, start, length);
		if (!value.trim().equals("")) {	 //	排除空白位置 
			System.out.println("-->value值:" + value);
		}
		
	}
}


结果:

----------开始解析文档----------
遇到books开始标签
---开始解析第1个book标签---
第1个属性名: id-->属性值:book1
第2个属性名: w-->属性值:wwwww
遇到name开始标签
遇到a开始标签
-->value值:AAAAAA
遇到a结束标签
-->value值:bookName1
遇到price开始标签
-->value值:10.0
---结束解析第1个book标签---
---开始解析第2个book标签---
第1个属性名: id-->属性值:book2
遇到name开始标签
-->value值:bookName2
遇到author开始标签
-->value值:bookAuthor2
---结束解析第2个book标签---
遇到books结束标签
----------结束文档解析----------
[Book [id=book1, name=bookName1, price=10.0, author=null], Book [id=book2, name=bookName2, price=null, author=bookAuthor2]]


本文出自 “theYllwRvrNo98” 博客,请务必保留此出处http://yellowriver.blog.51cto.com/8753974/1673948

XML文档的SAX解析

原文:http://yellowriver.blog.51cto.com/8753974/1673948

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!