`
deepnighttwo
  • 浏览: 52168 次
  • 性别: 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;

}

}

分享到:
评论

相关推荐

    Java SAX解析Xml文档Demo

    本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...

    java解析xml数据---sax解析器

    Java解析XML数据主要涉及到的是对XML文档的读取和处理,SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,适用于处理大型XML文件。与DOM(Document Object Model)解析器不同,SAX不需要一次性加载...

    Sax解析XML文件解析

    1. **创建解析器**:通常使用Java的`SAXParserFactory`类来创建解析器对象。 2. **设置事件处理器**:通过`SAXParser`的`setHandler`方法设置一个实现了`ContentHandler`接口的对象,这个对象将处理SAX解析过程中...

    Java使用sax、dom、dom4j解析xml文档

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在Java应用程序中,XML经常被用来作为数据交换的载体。Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document ...

    SAX解析XML文件实例

    SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...

    Servlet利用SAX解析XML文档

    在处理XML数据时,SAX(Simple API for XML)是一种常见的解析器,它采用事件驱动模型,以流式方式读取XML文档,降低了内存占用,适用于处理大型XML文件。本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 ...

    SAX解析开发帮助文档CH

    在给定的“SAX解析中文帮助文档.doc”中,可能会详细介绍如何使用SAX解析XML,包括设置解析器工厂、创建事件处理器、配置解析器选项、以及编写处理XML事件的方法。文档还可能涵盖错误处理、命名空间处理、以及如何...

    dom解析和sax解析

    DOM(Document Object Model)解析和SAX(Simple API for XML)解析是两种常见的XML文档解析方式,它们在处理XML数据时有不同的策略和优缺点。 DOM解析是一种基于树型结构的XML解析方法。当一个XML文档被DOM解析器...

    android使用SAX解析xml

    SAX(Simple API for XML)是一种事件驱动的解析器,适用于处理大型XML文档,因为它不需要将整个文档加载到内存中,而是逐行读取,从而节省资源。本篇文章将详细介绍如何在Android环境中使用SAX解析器来处理从网络...

    DOM和SAX解析XML文档

    XML(eXtensible Markup Language)是一种用于存储和传输数据的...此外,还可以考虑使用StAX(Streaming API for XML),这是一种介于DOM和SAX之间的解析方式,结合了两者的优势,既节省内存又允许有限的向前查找能力。

    javaSAX方式解析xml文档

    Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...

    sax解析xml文件

    总结来说,"saxloadxml"项目提供了使用SAX解析XML文件的一个实例,可以帮助开发者了解如何利用SAX解析器处理XML文档,尤其是在性能和内存使用方面有较高要求的情况下。通过学习和实践这个项目,你可以提升处理XML...

    SAX对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 ...

    SAX解析XML源码及文档

    android解析XML 文档及源码 大多数与XML 相关的Java API 在Android 上得到了完全支持,在Android 上可以创建功能强大的移动应用程序,而在Android 上解析XML的技术有三种DOM、SAX、PULL。

    Sax解析xml_动力节点Java学院整理

    DOM解析会将整个XML文档加载到内存中形成一个节点树,适合处理小规模或内存有限的情况。而SAX则在解析过程中逐个处理XML元素,仅在需要时读取数据,因此更适合处理大规模的XML文件。 SAX解析XML的核心在于事件...

    java中的sax解析方案

    Java中的SAX解析方案是一种高效的XML处理方法,尤其适用于大体积的XML文件。SAX(Simple API for XML)是基于事件驱动的解析器,它不会像DOM解析那样将整个XML文档加载到内存中,而是逐行读取并触发相应的事件处理器...

    sax解析xml尤其是获取元素的值或者内容

    - SAX解析器不处理XML的DTD(文档类型定义),如果需要验证XML文档,应考虑使用DOM或StAX解析器。 - SAX解析器不保留XML的结构,只提供事件通知,因此不适合需要回溯或查找元素关系的场景。 - 由于SAX是事件驱动...

    SAX与JAVA.rar_SAX java_java SAX_java sax download_sax_xml

    描述中提到,这个压缩包包含11个已经调试过的Java程序,这些程序展示了如何使用SAX解析XML文档。用户可以下载后根据自身需求进行调整和应用。其中,XML处理可能涵盖了各种场景,如数据提取、验证、遍历XML结构等。 ...

    Sax解析xml文件

    在Android和Java编程中,处理XML文件是常见的任务,而SAX(Simple API for XML)是一种轻量级、事件驱动的XML解析器,它以流式方式读取XML文档,只在需要时解析内容,因此非常适合处理大体积的XML文件。 SAX解析器...

Global site tag (gtag.js) - Google Analytics