SAX

java中提供了一系列的接口用于自定义解析xml的文件,中DefaultHandler是SAX事件处理程序的基类,通过重写SAX类,可以自定义对xml文件的解析。

在重写defaultHandler类时候,有一个重点是设立tag标记位,这个标记为用于记录当前处理的元素是哪一个,因为xml解析是一个嵌套的结构,character中可能还会调用startElement,因此必须设立一个标记位teg用于标记当前startElement解析到哪个标签了,然后character才能根据不同的tag定义不同的方法。


import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.*;
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import java.io.*;

class Book
{
	private String id;
	private String name;
	private String price;
	public void setId(String id)
	{
		this.id=id;
	}
	public void setName(String name)
	{
		this.name=name;
	}
	public void setPrice(String price)
	{
		this.price=price;
	}
	public String toString()
	{
		return id+":"+name+":"+price;
	}
}
class SaxParseService extends DefaultHandler
{
	private ArrayList<Book> books;
	private Book book;
	private String tag;
	public void startDocument() throws SAXException
	{
		System.out.println("开始解析");
		books=new ArrayList<Book>();
	}
	public void startElement(String uri,String localName,String pName,Attributes attrs) throws SAXException
	{
		if("book".equals(pName))
		{
			book=new Book();
			book.setId(attrs.getValue(0));
		}
		tag=pName;
	}
	public void characters(char [] ch ,int start ,int length )
	{
		if(tag!=null)
		{
			if("name".equals(tag))
		    {
				book.setName(new String(ch,start,length));
			}
			else if("price".equals(tag))
			{
				book.setPrice(new String(ch,start,length));
			}
		}
	}
	public void endElement(String uri,String localName,String pName) throws SAXException
	{
		if("book".equals(pName))
		{
			books.add(book);
			book=null;
		}
		tag=null;
	}
	public void endDocument() throws SAXException
	{
		System.out.println("结束解析");
	}
	public ArrayList<Book> getBooks()
	{
		return books;
	}
}
public class Demo
{
	public static void main(String [] args) throws Exception
	{
		SAXParserFactory sax=SAXParserFactory.newInstance();
		SAXParser parser=sax.newSAXParser();
		SaxParseService handle=new SaxParseService();
		InputSource input=new InputSource(new FileInputStream("book.xml"));
		parser.parse(input,handle);
		ArrayList<Book> books=handle.getBooks();
		for(Book book:books)
		{
			System.out.println(book);
		}
	}

}


附件是book.xml
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值