SAX是一种基于事件驱动模式的XML解析API,好处是快,而且节省内存,坏处是程序编写起来相对复杂,而且给人感觉不够OO。最好用的还是DOM,但是占内存太多,极限的时候会引起OutOfMemory异常。
闲话就说道这里,下面开始说程序。sun的JDK1.5中包含我下面程序将用到的所有import的类,所以运行的时候不需要第三方jar包。
//-------------------------------解析消息的主类----------------------------------------
packagesax;
importjava.io.File;
importjava.io.IOException;
importjavax.xml.parsers.ParserConfigurationException;
importjavax.xml.parsers.SAXParserFactory;
importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;
publicclassSAXParserextendsDefaultHandler...{
privateStringfilename=null;
//定义msn消息中的标签名称,为解析作准备
privatestaticfinalStringFirstSessionID="FirstSessionID";
privatestaticfinalStringLastSessionID="LastSessionID";
privatestaticfinalStringMessage="Message";
privatestaticfinalStringDate="Data";
privatestaticfinalStringTime="Time";
privatestaticfinalStringDateTime="DateTime";
privatestaticfinalStringSessionID="SessionID";
privatestaticfinalStringFrom="From";
privatestaticfinalStringTo="To";
privatestaticfinalStringLog="Log";
privatestaticfinalStringFriendlyName="FriendlyName";
privatestaticfinalStringUser="User";
privatestaticfinalStringText="Text";
//保存一条聊天信息的内容,在消息结束的时候打印
privateStringdata;
privateStringtime;
privateStringdataTime;
privateintsessionID;
privateStringfrom;
privateStringto;
privateStringtext;
//标记是不是可以打印一个消息了
privatebooleantextComming=false;
publicSAXParser(Stringfilename)...{
this.filename=filename;
}
publicvoidshowMessage()...{
//booleanvalidation=false;
//创建一个解析工厂
SAXParserFactoryspf=SAXParserFactory.newInstance();
//声明一个解析器
javax.xml.parsers.SAXParsersaxParser=null;
try...{
//创建一个解析器,并借西文档,将this作为事件监听器
saxParser=spf.newSAXParser();
saxParser.parse(newFile(filename),this);
}catch(SAXExceptionse)...{
System.err.println(se.getMessage());
System.exit(1);
}catch(IOExceptionioe)...{
System.err.println(ioe);
System.exit(1);
}catch(ParserConfigurationExceptione)...{
System.err.println(e);
System.exit(1);
}
}
/**//*
*SAX会将URL中的一些特殊符号做出一些不符合我们想象的分割,可以尝试将这个判断去掉,然后打开一个包含&等特殊符号的msn聊天记录看看会发生什么
*/
privatevoiddealMessage()...{
//
if(from==null&&to==null)...{
logWithoutLinebreak(this.text);
}else...{
log("("+this.dataTime+")"+from+"对"+to+"说:"
+this.text);
this.from=null;
this.to=null;
this.text=null;
}
}
//以下动作会按照顺序发生,其中startElement-characters-endElement是循环的。
@Override
publicvoidstartDocument()throwsSAXException...{
super.startDocument();
log("--------开始打印信息---------");
}
@Override
publicvoidstartElement(Stringuri,StringlocalName,StringqName,
Attributesattributes)throwsSAXException...{
super.startElement(uri,localName,qName,attributes);
if(Message.equalsIgnoreCase(qName))...{
this.data=attributes.getValue(Date);
this.time=attributes.getValue(Time);
this.dataTime=attributes.getValue(DateTime);
}elseif(User.equalsIgnoreCase(qName))...{
if(this.from==null)...{
this.from=attributes.getValue("FriendlyName");
}else...{
this.to=attributes.getValue("FriendlyName");
}
}elseif(Text.equalsIgnoreCase(qName))...{
textComming=true;
}
}
@Override
publicvoidcharacters(char[]ch,intstart,intlength)
throwsSAXException...{
super.characters(ch,start,length);
if(this.textComming)...{
this.text=newString(ch,start,length);
dealMessage();
}
}
@Override
publicvoidendElement(Stringuri,StringlocalName,StringqName)
throwsSAXException...{
super.endElement(uri,localName,qName);
if(this.textComming)...{
this.textComming=false;
}
}
@Override
publicvoidendDocument()throwsSAXException...{
super.endDocument();
log("--------打印信息结束---------");
}
privatevoidlog(Stringstr)...{
System.out.print(" "+str);
}
privatevoidlogWithoutLinebreak(Stringstr)...{
System.out.print(str);
}
}
//-------测试---------
/***//**
*
*/
packagesax;
importjava.awt.FileDialog;
importjava.awt.Frame;
/***//**
*@authorzhuge
*
*/
publicclassXMLParserTest...{
publicstaticvoidmain(String[]args)...{
Framef=newFrame();
FileDialogdlg=newFileDialog(f,"Open",FileDialog.LOAD);
dlg.setVisible(true);
Stringfilename=dlg.getDirectory()+dlg.getFile();
SAXParserparser=newSAXParser(filename);
parser.showMessage();
dlg=null;
f.dispose();
f=null;
}
}
分享到:
相关推荐
本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...
Java解析XML数据主要涉及到的是对XML文档的读取和处理,SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,适用于处理大型XML文件。与DOM(Document Object Model)解析器不同,SAX不需要一次性加载...
1. **创建解析器**:通常使用Java的`SAXParserFactory`类来创建解析器对象。 2. **设置事件处理器**:通过`SAXParser`的`setHandler`方法设置一个实现了`ContentHandler`接口的对象,这个对象将处理SAX解析过程中...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在Java应用程序中,XML经常被用来作为数据交换的载体。Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document ...
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
在处理XML数据时,SAX(Simple API for XML)是一种常见的解析器,它采用事件驱动模型,以流式方式读取XML文档,降低了内存占用,适用于处理大型XML文件。本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 ...
在给定的“SAX解析中文帮助文档.doc”中,可能会详细介绍如何使用SAX解析XML,包括设置解析器工厂、创建事件处理器、配置解析器选项、以及编写处理XML事件的方法。文档还可能涵盖错误处理、命名空间处理、以及如何...
DOM(Document Object Model)解析和SAX(Simple API for XML)解析是两种常见的XML文档解析方式,它们在处理XML数据时有不同的策略和优缺点。 DOM解析是一种基于树型结构的XML解析方法。当一个XML文档被DOM解析器...
SAX(Simple API for XML)是一种事件驱动的解析器,适用于处理大型XML文档,因为它不需要将整个文档加载到内存中,而是逐行读取,从而节省资源。本篇文章将详细介绍如何在Android环境中使用SAX解析器来处理从网络...
XML(eXtensible Markup Language)是一种用于存储和传输数据的...此外,还可以考虑使用StAX(Streaming API for XML),这是一种介于DOM和SAX之间的解析方式,结合了两者的优势,既节省内存又允许有限的向前查找能力。
Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...
总结来说,"saxloadxml"项目提供了使用SAX解析XML文件的一个实例,可以帮助开发者了解如何利用SAX解析器处理XML文档,尤其是在性能和内存使用方面有较高要求的情况下。通过学习和实践这个项目,你可以提升处理XML...
下面是一个简单的SAX解析XML文档的Java代码示例: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXXmlDemo extends ...
android解析XML 文档及源码 大多数与XML 相关的Java API 在Android 上得到了完全支持,在Android 上可以创建功能强大的移动应用程序,而在Android 上解析XML的技术有三种DOM、SAX、PULL。
DOM解析会将整个XML文档加载到内存中形成一个节点树,适合处理小规模或内存有限的情况。而SAX则在解析过程中逐个处理XML元素,仅在需要时读取数据,因此更适合处理大规模的XML文件。 SAX解析XML的核心在于事件...
Java中的SAX解析方案是一种高效的XML处理方法,尤其适用于大体积的XML文件。SAX(Simple API for XML)是基于事件驱动的解析器,它不会像DOM解析那样将整个XML文档加载到内存中,而是逐行读取并触发相应的事件处理器...
- SAX解析器不处理XML的DTD(文档类型定义),如果需要验证XML文档,应考虑使用DOM或StAX解析器。 - SAX解析器不保留XML的结构,只提供事件通知,因此不适合需要回溯或查找元素关系的场景。 - 由于SAX是事件驱动...
描述中提到,这个压缩包包含11个已经调试过的Java程序,这些程序展示了如何使用SAX解析XML文档。用户可以下载后根据自身需求进行调整和应用。其中,XML处理可能涵盖了各种场景,如数据提取、验证、遍历XML结构等。 ...
在Android和Java编程中,处理XML文件是常见的任务,而SAX(Simple API for XML)是一种轻量级、事件驱动的XML解析器,它以流式方式读取XML文档,只在需要时解析内容,因此非常适合处理大体积的XML文件。 SAX解析器...