`
deepnighttwo
  • 浏览: 49707 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用SAX解析msn聊天记录文档的java小程序

 
阅读更多

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;

}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics