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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值