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 Demo(详细注释)
java学习笔记——使用DOM解析XML和使用SAX解析XML
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
Java使用sax、dom、dom4j解析xml文档的代码,包含dom4j的jar包。
本资源为SAX解析中文帮助文档。通过SAX解析方式解析XML文档,可以在XML文档大量数据中快速查找想要的数据,提高程序执行效率。
DOM和SAX解析XML文档
android解析XML 文档及源码 大多数与XML 相关的Java API 在Android 上得到了完全支持,在Android 上可以创建功能强大的移动应用程序,而在Android 上解析XML的技术有三种DOM、SAX、PULL。
Servlet利用SAX解析XML文档,JAX,JSWDP,Servlet利用SAX解析XML文档
java从服务器读取xml文件并以SAX方式解析附带(服务器与解析源码)
Sax解析XML文件解
使用SAX方式解析XML SAX 是读取和操作 XML 数据的更快速、更轻量的方 法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件...
使用sax解析从网络上获取的xml文件
JAVA SAX解析XMLJAVA SAX解析XMLJAVA SAX解析XML
dom和sax解析的区别,dom的概念,sax的概念
Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有...
JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML
NULL 博文链接:https://lujo20121128.iteye.com/blog/1736765
JAVA100例之实例69 JAVA使用SAX解析XML
SAX对xml文档进行解析
java读取RSS-SAX解析XML的实例,java语言编写,使用时只需要在main方法中将参数换成自己的RSS地址即可。