Java 解析chm文件实战(原创)

需求:java解析chm文件,并将内容插入数据库和redis.

Java解析chm文件,网上除了github上有个家伙只言片语了一下,没有啥资料参考,包括chm4j这东西,没啥介绍,本着服务大众的精神,整理了下流程, 时间仓促,错误之处在所难免,望指正.

第一步:下载chm4j.jar以及依赖

http://sourceforge.net/projects/chm4j/

第二步:新建java工程,建一个解析ParseChm类,建一个解析测试类,类似:

ParseChm类:

//下面的包,请导入chm4j.jar,并且把chm4j.dll拷贝到jre的lib目录内,linux或mac请拷贝libchm4j.so即//可,因为chm4j.jar依赖于c++

package cn.lswe.baseframe.utils;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import org.chm4j.*;

import cn.lswe.baseframe.validator.Conf;

public class ParseChm {

public static void main(String... args) {

try {

ChmFile cFile = new ChmFile(Conf.ChmSOurce);

String dir = Conf.dir;

ChmEntry.Attribute attributes = ChmEntry.Attribute.ALL;

ChmEntry[] entries = cFile.entries(attributes);

for (ChmEntry entry : entries) {

listChmEntry(dir, entry, attributes);

}

} catch (IOException ex) {

System.out.println("Error : " + ex.getMessage());

}

}

/**

* Extracts recursively the sub entries of the specified ChmEntry into the

* specified output directory according to the specified attributes.

* @param output The output directory.

* @param entry

* @param attributes

* @throws java.io.IOException If an I/O error occurs.

*/

private static void listChmEntry(String output, ChmEntry entry, ChmEntry.Attribute attributes) throws IOException {

printEntry(entry);

String er=GuidHelper.CreateGuid().toString();

File dest = new File(output, entry.getPath());

if (entry.hasAttribute(ChmEntry.Attribute.DIRECTORY)) {

if (!dest.isDirectory()) {

if (!dest.mkdirs()) {

throw new IOException("failed to create directory : " + dest);

}

}

for (ChmEntry e : entry.entries(attributes)) {

listChmEntry(output, e, attributes);

}

} else {

InputStream in = null;

OutputStream out = null;

try {

in = entry.getInputStream();

out = new FileOutputStream(dest);

int bufferSize = 1024;

byte[] data = new byte[bufferSize];

int nbRead;

while ((nbRead = in.read(data)) > 0) {

out.write(data, 0, nbRead);

out.flush();

}

} catch (IOException ex) {

System.out.println(ex.getMessage());

} finally {

try {

if (out != null) {

out.close();

}

} finally {

if (in != null) {

in.close();

}

}

}

}

}

/**

* Display the specified entry.

* @param entry

*/

private static void printEntry(ChmEntry entry) {

StringBuilder sb = new StringBuilder("Extract entry " + entry + "(");

boolean first = true;

for (ChmEntry.Attribute attribute : entry.getAttributes()) {

if (first) {

first = false;

} else {

sb.append(", ");

}

sb.append(attribute);

}

sb.append(")");

System.out.println(sb.toString());

}

}

这就得到了若干中转html文件(两万多个),注意,chm文件的格式相当复杂,决定了这样的处理方法,事实上我接下来的word,freemind文件,统统都这样处理的.

测试类:

package cn.lswe.baseframe.spider;

import java.io.FileNotFoundException;

import java.util.LinkedList;

import java.util.List;

import cn.lswe.baseframe.utils.FileHelper;

import cn.lswe.baseframe.validator.Conf;

import us.codecraft.webmagic.Page;

import us.codecraft.webmagic.Site;

import us.codecraft.webmagic.Spider;

import us.codecraft.webmagic.pipeline.ConsolePipeline;

import us.codecraft.webmagic.processor.PageProcessor;

public class ParseDisease implements PageProcessor {

private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

@Override

public void process(Page page) {

List<String>links=new LinkedList<String>();

links.add(Conf.diseaseDataSource);

page.addTargetRequests(links);

List<String> tdList = page.getHtml().xpath("table").xpath("td").all();

//这里利用了webmagic爬虫框架,可以参照这个链接做:

// http://webmagic.io/docs/zh/

int j=0;

int k=0;

for(int i=0;i<tdList.size();i++){

//在这里,可以筛选,处理你的内容了

//插入jedis,插入数据库都ok

j=i+1;

k=i+2;

String td1=tdList.get(i);

String td2=tdList.get(i);//第二列要拆分为一个数组,它是第一列的下一级分类

String td3=tdList.get(i);//如果第一列是字母,第三列和第二列一一对应,如果第一列是汉字,第三列和第二列第二行开始一一对应,其编码是”B”+第一行第三列+本行第三列

}

System.out.println(tdList);

}

@Override

public Site getSite() {

return site;

}

@SuppressWarnings("deprecation")

public static void testSpider() {

// Conf.diseaseDataSource 嗅探的起点,比如www.ask.com,为了速度,请把所有资源文件部署

//localhost

Spider.create(new ParseDisease())

.addUrl(Conf.diseaseDataSource)

.pipeline(new  ConsolePipeline()).thread(5).run();

//开启5个线程抓取

}

}.

调用方法:

@ResponseBody

@RequestMapping("/test/spider")

public void spider()

{

//OschinaBlogPageProcesser.testSpider();

ParseChm.testSpider();

}

时间: 2024-11-03 05:43:35

Java 解析chm文件实战(原创)的相关文章

java解析dbf文件

dbf文件, 不能直接另存为excel文件, 会丢数据! 需要将dbf数据存储到数据库中, 在从数据库中将数据导出成excel. import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.ArrayList; import java.u

Java解析XML文件的四种方法

[摘要] 可扩展标志语言(XML)在实现信息标准化.信息的交流与共享上有其独特的技术优势,因此受到了广泛的重视.本文先简单的介绍了XML基本知识,然后从XML应用入手总结了四种现今最常见的XML的解析方法,介绍了这四种方法的特点,其中包括优点与不足之处.最后给出了一个简单的案例来对这四种解析进行代码介绍. [关键字] XML文件,DOM,SAX,JDOM,DOM4J [引言] XML即可扩展标记语言(EXtensible Markup Language),是标准通用标记语言的子集,是一种用于标记

java解析xml文件并输出

使用java解析xml文件,通过dom4j,代码运行前需先导入dom4j架包. ParseXml类代码如下: import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class

java解析xml文件四种方式介绍、性能比较和基本使用方法

一.介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不

java解析properties文件

在自动化测试过程中,经常会有一些公用的属性要配置,以便后面给脚本使用,我们可以选择xml, excel或者json格式来存贮这些数据,但其实java本身就提供了properties类来处理properties文件,虽然名字叫properties,其实打开它发现就是一个记事本的文件,所以看起来也比较直观,下面是解析properties文件的实现代码. properties文件里存贮的样子是这样的,然后给他保存为xxx.properties即可. gsBAMUserName1=automation_

java 解析 xml 文件

学习下解析 xml 文件,这里用到了 org.dom4j 这个 jar 包,使用 eclipse 没有这个包的小伙伴可以去下个 jar 包,然后复制到项目路径下,右键 jar 包后 build path,add build path 即可. 来引入相关依赖: import java.io.File; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Elem

Java 解析 IPA 文件,读取 Info.plist 信息

在做移动MDM功能的时候,就遇到了这样一个问题,当用户上传IPA文件时,我如何知道这个IPA文件的相关信息呢?IPA文件有一个很重要的文件Info.plist 就类似于Android程序的Manifest.xml,只要能够从IPA文件中提取出来Info.plist,然后在进行解析提起相关信息,那就马到成功了.那么,按照上面步骤开始了. 1.Java解压IPA文件,只获取 Info.plist /**  * 解压IPA文件,只获取IPA文件的Info.plist文件存储指定位置  * @param

java解析xml文件

为什么使用xml作为数据交换?为什么用java解析xml?为什么用dom4J解析xml?dom解析和sax解析到底有什么区别? 带着这样的问题去学习,你发现这样的学习是最高效的 首先第一个问题:为什么使用xml作为数据交换 首先xml是一种无平台限制,无语言限制,无系统限制.使得xml可以在不同语言写的系统进行数据的交换,不同语言写的系统之间需求是不会改变,可能xml这种传输数据的介质会被其他的替代.比如json,可能json也会面临被替代.方式改变.但是需求是不会改变的.而且xml树节点的结构

Java解析XML文件的方式

在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到“解析xml文件”的需求.一般来讲,有基于DOM树和SAX的两种解析xml文件的方式,在这部分里,将分别给大家演示通过这两种方式解析xml文件的一般步骤. 1 XML的文件格式     XML是可扩展标记语言(Extensible Markup Language)的缩写,在其中,开始标签和结束标签必须配套地出现,我们来看下book.xml这个例子. 1 <?xml version=