xml文件解析之sax解析

本文介绍使用Java的SAX方式解析XML文件的方法。通过继承DefaultHandler类并覆写关键方法,可以实现对特定格式的XML文件进行解析。示例代码展示了如何读取XML中的元素和属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java的SAX方式解析xml时,解析类需要继承DefaultHandler类,并覆写startDocument、startElement、characters、endElement和endDocument方法。

示例如下:

 

package com.benny.demo.xml;

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

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


/**
 * TODO 这里添加描述
 * 
 * @author xiaobing
 * @version V 1.0
 * @since 2014-5-21
 */
public class MyHandler extends DefaultHandler
{
	private List<Book> books;

	private String currentTag;

	private Book book;

	/**
	 * 构造方法
	 */
	public MyHandler()
	{
		// TODO Auto-generated constructor stub
	}

	public void startDocument()
	{
		books = new ArrayList<Book>();//初始化数据容器集合
	}

	public void startElement(String uri, String localName, String qName, Attributes attributes)
	{

		if ("book".equals(qName))//根据qName判断读到的标,并根据标签确定当前要作的操作
		{
			book = new Book();//初始化存储数据对象

			for (int i = 0; i < attributes.getLength(); i++) //读取标签属性值
			{
				if ("id".equals(attributes.getQName(i)))
				{
					book.setId(attributes.getValue(i));
				}
			}
		}
		currentTag = qName; //记录读取到下一个标签前的标签作为当前标签

	}

	public void characters(char ch[], int start, int length)
	{
		String text = new String(ch, start, length); //此处读取到的值就是currentTag记录的标签的值

		if ("name".equals(currentTag))
		{
			book.setName(text);
		}
		else if ("price".equals(currentTag))
		{
			book.setPrice(text);
		}
	}

	public void endElement(String uri, String localName, String qName)
	{
		if ("book".equals(qName))
		{
			books.add(book);//添加到集合中
		}
		currentTag = null;
	}

	public void endDocument()
	{
		//根据情况,此方法可不覆写
	}

	public List<Book> getBooks()
	{
		return books;
	}

}


解析类调用方法如下:

public static void main(String[] args)
	{
		File file = new File("d:\\books.xml");
		MyHandler handler = new MyHandler();

		try
		{
			InputStream is = new FileInputStream(file);

			SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
			parser.parse(is, handler); //此方法无返回值,调用解析后,解析结果在handler中
			
			List<Book> books = handler.getBooks(); //从handler中取出解析后的数据
			
			for (Book book : books)
			{
				System.out.println(book);
			}
			
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (ParserConfigurationException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (SAXException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

 

从解析过程可以看出,我们采用sax解析时很多时候要根据读到的标签是什么来判断该做什么,所以sax解析的前提是我们要知道xml的内容格式,每个sax方式实现的解析都是针对特定格式的xml文件的,也就是拿着一个具体的xml了,然后才能去读它。


 附:

解析的xm文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<books>
	<book id="1001">
		<name>Thinking In Java</name>
		<price>80.00</price>
	</book>
	<book id="1002">
		<name>Core Java</name>
		<price>90.00</price>
	</book>
	<book id="1003">
		<name>Hello, Andriod</name>
		<price>100.00</price>
	</book>
</books>  


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值