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

读取MSN聊天记录(XML文件)的VB6源码 MSN的聊天记录是XML格式,查看略有不便,做了个转为TXT的小程序 立即下载

SAX是一种基于事件驱动模式的XML解析API,好处是快,而且节省内存,坏处是程序编写起来相对复杂,而且给人感觉不够OO。最好用的还是DOM,但是占内存太多,极限的时候会引起OutOfMemory异常。

闲话就说道这里,下面开始说程序。sun的JDK1.5中包含我下面程序将用到的所有import的类,所以运行的时候不需要第三方jar包。 

 

//-------------------------------解析消息的主类----------------------------------------
package sax;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParser extends DefaultHandler {

    
private String filename = null;

    
// 定义msn消息中的标签名称,为解析作准备

    
private static final String FirstSessionID = "FirstSessionID";

    
private static final String LastSessionID = "LastSessionID";

    
private static final String Message = "Message";

    
private static final String Date = "Data";

    
private static final String Time = "Time";

    
private static final String DateTime = "DateTime";

    
private static final String SessionID = "SessionID";

    
private static final String From = "From";

    
private static final String To = "To";

    
private static final String Log = "Log";

    
private static final String FriendlyName = "FriendlyName";

    
private static final String User = "User";

    
private static final String Text = "Text";

    
// 保存一条聊天信息的内容,在消息结束的时候打印
    private String data;

    
private String time;

    
private String dataTime;

    
private int sessionID;

    
private String from;

    
private String to;

    
private String text;

    
// 标记是不是可以打印一个消息了
    private boolean textComming = false;

    
public SAXParser(String filename) {
        
this.filename = filename;
    }


    
public void showMessage() {
        
// boolean validation = false;
        
// 创建一个解析工厂
        SAXParserFactory spf = SAXParserFactory.newInstance();
        
// 声明一个解析器
        javax.xml.parsers.SAXParser saxParser = null;
        
try {
            
// 创建一个解析器,并借西文档,将this作为事件监听器
            saxParser = spf.newSAXParser();
            saxParser.parse(
new File(filename), this);
        }
 catch (SAXException se) {
            System.err.println(se.getMessage());
            System.exit(
1);
        }
 catch (IOException ioe) {
            System.err.println(ioe);
            System.exit(
1);
        }
 catch (ParserConfigurationException e) {
            System.err.println(e);
            System.exit(
1);
        }

    }


    
/*
     * SAX会将URL中的一些特殊符号做出一些不符合我们想象的分割,可以尝试将这个判断去掉,然后打开一个包含&等特殊符号的msn聊天记录看看会发生什么
     
*/

    
private void dealMessage() {
        
// 
        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
    
public void startDocument() throws SAXException {
        
super.startDocument();
        log(
"--------开始打印信息---------");
    }


    @Override
    
public void startElement(String uri, String localName, String qName,
            Attributes attributes) 
throws SAXException {
        
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);
        }
 else if (User.equalsIgnoreCase(qName)) {
            
if (this.from == null) {
                
this.from = attributes.getValue("FriendlyName");
            }
 else {
                
this.to = attributes.getValue("FriendlyName");
            }

        }
 else if (Text.equalsIgnoreCase(qName)) {
            textComming 
= true;

        }

    }


    @Override
    
public void characters(char[] ch, int start, int length)
            
throws SAXException {
        
super.characters(ch, start, length);
        
if (this.textComming) {
            
this.text = new String(ch, start, length);
            dealMessage();
        }

    }


    @Override
    
public void endElement(String uri, String localName, String qName)
            
throws SAXException {
        
super.endElement(uri, localName, qName);
        
if (this.textComming) {
            
this.textComming = false;
        }

    }


    @Override
    
public void endDocument() throws SAXException {
        
super.endDocument();
        log(
"--------打印信息结束---------");
    }


    
private void log(String str) {
        System.out.print(
" " + str);
    }


    
private void logWithoutLinebreak(String str) {
        System.out.print(str);
    }

}



//-------测试---------


/**
 * 
 
*/

package sax;

import java.awt.FileDialog;
import java.awt.Frame;

/**
 * 
@author zhuge
 * 
 
*/

public class XMLParserTest {

    
public static void main(String[] args) {
        Frame f 
= new Frame();
        FileDialog dlg 
= new FileDialog(f, "Open", FileDialog.LOAD);
        dlg.setVisible(
true);
        String filename 
= dlg.getDirectory() + dlg.getFile();
        SAXParser parser 
= new SAXParser(filename);
        parser.showMessage();
        dlg 
= null;
        f.dispose();
        f 
= null;

    }

}

使用ArcGIS Pro进行土地利用分类的机器学习与深度学习 传统的土地利用分类方法通常依赖于手动解译和规则定义,但随着机器学习和深度学习的发展,我们现在可以利用这些技术来自动化和提高分类的精度。ArcGIS Pro是一种功能强大的GIS软件,它提供了丰富的工具和功能,可以支持土地利用分类的机器学习和深度学习。我们将首先讨论数据准备和预处理的步骤,然后介绍常用的机器学习和深度学习方法,并提供相应的源代码示例。这可以通过人工标注或半自动的方式完成。数据裁剪:根据研究区域的范围,裁剪遥感影像数据,以减少计算和存储的负担,并确保只包含感兴趣的土地利用区域。 阅读详情

相关推荐

NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()

Please use torch.nn.Module.to_empty() instead of torch.nn.Module.to()输出(llama) (base) [root@localhost home]# nvidia-smi Unable to determine the device handle for GPU0000:09:00.0: Unknown Error。这是典型的“孤儿进程”,但它还是。(僵尸进程),占用 GPU 资源。如果进程仍然不消失,并且。,这意味着它的父进程是。

m0_61636632的博客 2096

12.常用模块

datetime collections:namedtuple,deque,defaultdict,OrderedDict,Counter base64 hashlib,md5 itertools:无限迭代器,takewhile,cycle,repeat,分组 contextlib urllib XML:sax,dom 1.datetime 当...

Aislli的博客 3763

笔记——Oracle19c

Oracle阅读笔记

weixin_63819458的博客 1350

Java 解析 XML文件

目录: 初次邂逅xml 在java程序中如何获取xml文件的内容 在java程序中如何生成xml文件 一、java解析和生成xml 1、初次邂逅xml xml:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。表现:以 .xml 为文件扩展名的文件存储:树形结构 XML是一种类似于HTML的标记语言,XML是用来描述数据的,XML的标...

喜欢历史的码农 561

docker 安装oracle

本文介绍了使用Docker部署Oracle数据库的实践指南。主要内容包括:常用Oracle镜像的阿里云和华为云拉取地址,11g/12c/19c等不同版本的启动命令示例,以及连接数据库的基本信息。实战部分详细演示了Oracle 11g的安装过程,包括镜像拉取、容器启动、密码修改和数据库连接步骤,并通过Sql Developer和命令行两种方式创建用户。最后提到数据持久化的重要性,建议将数据库文件挂载到宿主机目录以防止容器删除导致数据丢失。文章提供了完整的操作命令和截图说明,适合需要快速部署Oracle测试环境

weixin_39766667的博客 373

二手分析仪器改造实战:如何用PMT搭建荧光检测电路(附完整电路图)

本文详细介绍了如何利用二手分析仪器中的光电倍增管(PMT)核心部件,进行荧光检测电路的实战改造。内容涵盖从PMT工作原理理解、高压供电电路设计、低噪声前置放大(跨阻放大器)到信号调理的完整流程,并提供了关键电路图与调试排错指南,旨在帮助电子爱好者与工程师低成本构建稳定、高灵敏度的专业检测系统。

weixin_29234239的博客 441

XML概述

XML的特点: 1)XML文件是纯文本文件,后缀名为.xml,可以使用记事本等各种文本编辑器打开,也可以在ie浏览器下显示。 2)XML不是一种编程语言(和C,Java不是一类),可以把它理解为一种数据格式,XML最大的优点就是对数据的描述,XML使用标签描述数据的含义(并非像HTML一样注重数据的显示),XML文件的核心是数据本身。XML的优点: 1)可扩展   标记是...

csndmi的专栏 226

PPO算法详解:基于CartPole-v1的强化学习实现

PPO算法详解:基于CartPole-v1的强化学习实现

m0_54720701的博客 865

HashSet的contains方法

关于HashSet的发现: 1:HashSet是一个Set,也就是所谓的集合。集合的概念是元素在集合中无序、唯一。无序对于计算机来说没有什么意义,因为

DeepNightTwo的专栏 1万+

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 376

RT-DETR改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

本文记录的是基于MobileNet V4的RT-DETR目标检测轻量化改进方法研究。通过整合UIBMobile MQA以及优化的NAS策略能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中和五种模型,以满足不同的需求。

Limiiiing的博客 1923

报LinkageError的原因(1)

LinkageError是一个比较棘手的异常,准确的说它是一个Error而不是Exception。java api对它没有直接的解释,而是介绍了它的子类:    Subclasses of LinkageError indicate that a class has some dependency on another class; however, the latter class has

DeepNightTwo的专栏 1万+

YOLOv11改进 | 引入SFSConv空间频率选择卷积(含SFSC3k2二次创新),空间频率特征协同作用,检测性能全面提升

本文提出在YOLOv11中引入SFSConv空间频率选择卷积模块,通过显式分离和动态融合空间域与频率域特征,解决传统卷积对多尺度目标检测的局限性。SFSConv包含空间频率分离、动态权重融合和协同特征重建三个核心机制,并进一步创新提出SFSC3k2结构,通过双路频率分支增强特征协同作用。该改进显著提升了YOLOv11在遥感、医学等多尺度复杂场景下的检测性能,实验显示在微小目标检测任务中mAP提升5%-10%。代码实现展示了SFSConv模块的核心逻辑及其在PyTorch中的高效实现。

走向CTO的路上... 768

得到方法调用者和java中的位操作符

获取方法的调用者如果你写了一个超级复杂超级大的项目,在项目后期调试修改的时候,突然想知道到底是哪些类调用了ImportantClass中的Important方法,你会怎么做呢?首先,你可能说:我用不到!如果这样的话,到这里你就可以return了。做法一:最常规有效的做法,使用IDE的全目录全文搜索方法名。当然这样是最有效快速的。但是如果有很多别的类中也定义了Important方法,你就会得

DeepNightTwo的专栏 3694

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Javasssist初探(需要对Java的ClassLoader机制有一些了解)

Javassist可以用来动态生成java类,就好像js可以生成可执行的js代码一样。javassist是JBoss的一个子项目,用处的话可能是在对EJB提供支持的时候,将声称各种接口的实现类和代理类。下面给出一个例子,在这个例子中一共有三个类:DirectLoader自定义类加载器;IAccess是接口类(我们动态生成的类要实现这个接口) ;MainTest完成主要逻辑的类,其中javass

DeepNightTwo的专栏 3507

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java多线程中的wait与notify

    wait与notify是java同步机制中重要的组成部分。结合与synchronized关键字使用,可以建立很多优秀的同步模型。   synchronized(this){}等价与public synchronized void method(){.....}   同步分为类级别和对象级别,分别对应着类锁和对象锁。类锁是每个类只有一个,如果static的方法被synchronized关键字

DeepNightTwo的专栏 2918

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TPTP官方文档

http://www.eclipse.org/tptp/home/documents/index.html

DeepNightTwo的专栏 2579

大学时候想的一个算法——计算数组中最大和序列

本文与java语言无关,纯粹就是个解决问题的想法问题:给定一个数组,要求求出数组中连续数和最大的索引对。比如,给定一个数组,里面有正数有负数和0。其中肯定有一个连续的序列(连续的,中间不能间断),比如说是索引3到索引5,这个序列的和是这个数组中连续序列中最大的,别的都没这个大。{0,2.-1,9,7.6,-8,16},这个数组中就是索引三到索引五这个连续序列的和最大。要求算法的时间复杂度问O(n)

DeepNightTwo的专栏 2169

Eclipse类加载机制带来的问题

除了核心类外,eclipse的功能都是由插件提供的。插件之间经常会互相扩展,这些插件之间难免要使用到彼此的类。Eclipse给每一个插件都分配的一个classloader来负责加载其中的类。所以默认情况下,Eclipse的不同插件中的类是彼此不可见的。在两种情况下Eclipse插件可能用到其它插件的类。一是直接添加plug-in dependence,然后在程序中直接使用。然后是把extens

DeepNightTwo的专栏 2133

关于java数组的深度思考

刚刚开始接触java数组的人都会听到一句类似的话:java是纯面向对象的语言,他的数组也是一个对象。于是乎,我就按照一个对象的方式来使用数组,心安理得。直到我接触到C的数组后,才发现将数组作为一个类来使用在实现上是多么的“不自然”。首先我们看一下表面现象,数组创建的时候采用的是如下语句:MyClass[] arr = new MyClass[9];而普通类采用的是如下语句:MyClass obj

DeepNightTwo的专栏 1751

使用Java中的final变量需要注意的地方。

对与java中的final变量,java编译器是进行了优化的。每个使用了final类型变量的地方都不会通过连接而进行访问。比如说Test类中使用了Data类中一个final的int数字fNumber=77,这时候,java编译器会将77这个常数编译到Test类的指令码或者常量池中。这样,每次Test类用到fNumber的时候,不会通过引用连接到Data类中进行读取,而是直接使用自己保存在类文件中的

DeepNightTwo的专栏 1721

swing编程的一些需要注意的事情

swing是非线程安全的,也就是说,如果多个线程同时对一个swing组件进行操作,很可能会引发异常等问题,以至程序崩溃。毕竟,repaint是一个比较花费时间的操作,如果一个swing组件在repaint的过程中,其内容被更改,就会导致repaint的内容与修改后的内容不符,可能导致访问错误(比如多线程环境下修改一个List的item项)。使用Swing的时候,有几个需要注意的地方。首先,当一

DeepNightTwo的专栏 1628

记录一下连接各种数据库的url,备忘。

Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。  一、连接各种数据库方式速查表  下面罗列了各种数据库使用JDBC连接的方式,可以作为一个

DeepNightTwo的专栏 1497

nio简介

nio简介    nio的Socket编程中改变最大的是服务器端,客户端可以没有什么变化。目的是增加服务器吞吐量和并行处理客户端请求的能力,改变服务器端阻塞的模型。其设计上采用了Observer模式,使用事件触发机制进行io并行处理。   ByteBuffer:封装了一个byte[],作为数据载体。   ServerSocketChannel:服务器套接字通道通过其工厂方法ServerSock

DeepNightTwo的专栏 1484
上一篇: Javasssist初探(需要对Java的ClassLoader机制有一些了解)
下一篇: 关于java数组的深度思考
DeepNightTwo
博客等级 码龄21年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值