java中使用SAX读写XML文件

时间: 2007-10-13

SAX 是 Simple API for XML 的简写。虽说simple,用起来却比DOM麻烦,不过麻烦是有性能作为回报的。

SAX不会一次组织一整棵XML文档的抽象树给你使用,而是看到什么就问一下你要不要执行什么,这就是所谓的“基于事件”。

XML文件继续使用DOM和JDOM中的例子,当SAX解析器(实际上好像不应这么叫)读取文件,遇到“<books>”元素的时候,它知道这是文档开头,于是问你要不要干些什么;然后继续读取XML文档,当遇到“<book>”元素时,它又会问你要不要干些什么...直到整个XML文件被读取完毕,不过这时它还会问你,“文档读完了,你要不要干些什么呢?”...

关于这个过程,较为专业的说法是:


SAX 分析经过其的 XML 流,这非常象老式的自动收报机纸条。考虑以下 XML 代码片断:

<?xml version="1.0"?>
<samples>
<server>UNIX</server>
<monitor>color</monitor>
</samples>




一般情况下,SAX 处理器分析这段代码将生成以下事件:

Start document
Start element (samples)
Characters (white space)
Start element (server)
Characters (UNIX)
End element (server)
Characters (white space)
Start element (monitor)
Characters (color)
End element (monitor)
Characters (white space)
End element (samples)




SAX API 允许开发者捕获这些事件,并对它们进行操作。

SAX 处理涉及以下几步:

创建事件处理程序。
创建 SAX 解析器。
将事件处理程序分配给解析器。
对文档进行解析,将每个事件发送给处理程序。


以下是一个例子,扩展DefaultHandler类,因为此类已实现ContentHandler所有方法,所以我们使用时只需要覆盖要用到的几个方法就行了。



SAX是边读取边解析文档的,当它读到XML文件中间部分的时候,它不知道之前曾经读过些什么,也不知道以后会读到些什么,所以我们要想办法将已读的信息保存起来。因为一个books里有多个book,一个book里有title、author等属性,所以我们可以创建一个book元素的抽象对象,放到一个代表books的Hashtable里面。

这个book对象的代码:



public class BookBean {
private String title = "";
private String author = "";
private String url = "";
private String day ="";
private String month ="";
private String year ="";
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getDate()
{
return this.day+"-"+this.month+"-"+this.year;
}
}





以下是一个使用SAX读取XML文件的例子:





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

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.util.*;

public class MySAX extends DefaultHandler
{
private Hashtable table = null;
private BookBean book = null;
private String value = "";


public MySAX()
{
System.out.println("invoke MySAX().");
table = new Hashtable();
}

public void open(String xmlfile)
{
try{
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(false);
SAXParser parser = spf.newSAXParser();
XMLReader myreader = parser.getXMLReader();
myreader.setContentHandler(this);
InputSource source = new InputSource(xmlfile);
myreader.parse(source);



}catch(Exception e){
System.out.println("an error caused.");
}
}

public static void main(String args[])
{
System.out.println("main.");
MySAX ms = new MySAX();
ms.open("e:/xml.xml");
Hashtable table = ms.getTable();
Enumeration enu = table.keys();
while(enu.hasMoreElements()){
String title = (String)enu.nextElement();
BookBean book = (BookBean)table.get(title);
System.out.println(book.getTitle());
}
}

public void startDocument() throws SAXException
{
System.out.println("startDocument");
}
public void startElement(String namespaceURI,String localName,String qName,Attributes attrs) throws SAXException
{
if(qName.equals("book"))
{
if(book!=null)
table.put(book.getTitle(),book);
book = new BookBean();
}
}

public void endElement(String namespaceURI,String localName,String qName) throws SAXException
{
if(qName.equals("title"))
book.setTitle(value);
if(qName.equals("author"))
book.setAuthor(value);
if(qName.equals("url"))
book.setUrl(value);
if(qName.equals("day"))
book.setDay(value);
if(qName.equals("month"))
book.setMonth(value);
if(qName.equals("year"))
book.setYear(value);
}

public void characters(char ch[],int start,int length) throws SAXException
{
value = new String(ch,start,length);
}

public void endDocument() throws SAXException
{
table.put(book.getTitle(),book);
}

public Hashtable getTable()
{
return this.table;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值