html2javabean

摘要:
可是如果是一个项目,页面上千个,而且,还有而且哦,而且别人的网页格式可能会变,布局会变,举个例子,假如一段html是user001,现在改成了user001,有用的数据"user001"没有变,可是样式变了。这时我们就需要一个这样的功能组件,可以把某段html代码里有用的信息抽取出来,转成我们可以操作的业务bean对象。就像这样的配置文件:1234567˂!

这个有“标题党”之嫌了。名字但是像模像样。关于网页爬虫(就是抓取网页内容)的小工具大家都写过吧。可是一般写这样的东西都是类似完成某个简单的需求而 写的类似脚本语言的东西,一般代码不多,类似黑客程序代码风格。大家应该没有做过大型项目全部以抓取网页内容为数据源吧?我就做过这样的项目,呵呵。
如果真是一个多人合作,周期较长,又是一个产品型的项目,需要维护,升级,那代码就不是一次性的了。得有点企业开发的代码风格。
如果数据源都是要从网页抓取的话,开发就很装简单了,先通过URLConnection之类的api得到网页内容,再用正则表达式分析出里面有用的内容。 就这么简单。可是如果是一个项目,页面上千个,而且,还有而且哦,而且别人的网页格式可能会变,布局会变,举个例子,假如一段html是<td class="tig">user001</td>,现在改成了<li>user001</li>,有用的数 据"user001"没有变,可是样式变了。这时候如果还要改代码的话是不是要在代码改正则表达式了。
这时我们就需要一个这样的功能组件,可以把某段html代码里有用的信息抽取出来,转成我们可以操作的业务bean对象。
而且这个抽取规则是可配置的,而不是硬编码在代码里。就像这样的配置文件

1 <html2javaConfig>2 3 <bean id="user1"class="com.googlecode.html2javabean.client.User">4 5 <property name="name"groupIndex="1">6 7 <![CDATA[8 9 <span id="lblName">(.*?)</span>
10 11 ]]>12 13 </property>14 15 <property name="code">16 17 <![CDATA[18 19 <span id="lblWork">(.*?)</span></td>
20 21 ]]>22 23 </property>24 25 <property name="isMan">26 27 <![CDATA[28 29 <span id="lblSex">(.*?)</span></td>
30 31 ]]>32 33 </property>34 35 </bean>36 37 </html2javaConfig>

要抽取的html文件如下

1 <table style="height: 306px;  99%;">2 3 <tr>4 5 <th style=" 100px;"align="left">6 7 姓名:</th>8 9 <td>10 11 &nbsp;<span id="lblName">tony</span>12 13 </td>14 15 </tr>16 17 <tr>18 19 <th align="left">20 21 员工编号:</th>22 23 <td>24 25 <span id="lblWork">ite00395</span></td>26 27 </tr>28 29 <tr>30 31 <th align="left">32 33 性别:</th>34 35 <td>36 37 <span id="lblSex">man</span></td>38 39 </tr>40 41 <tr>42 43 <th align="left">44 45 Email:</th>46 47 <td>48 49 <span id="lblEmail">lihf@gggg.com</span>50 51 </td>52 53 </tr>54 55 <tr>56 57 <th align="left">58 59 MSN:</th>60 61 <td>62 63 <span id="lblMsn">lhf@hotmail.com</span></td>64 65 </tr>66 67 <tr>68 69 <th align="left">70 71 公司电话:</th>72 73 <td>74 75 <span id="lblPhone"></span></td>76 77 </tr>78 79 <tr>80 81 <th align="left">82 83 移动电话:</th>84 85 <td>86 87 <span id="lblMobile">13714896419</span></td>88 89 </tr>90 91 <tr>92 93 <th align="left">94 95 所属部门:</th>96 97 <td valign="middle">98 99 <span id="lblDepartment">P后台项目组</span></td>100 101 </tr>102 103 <tr>104 105 <th align="left">106 107 部门地址:</th>108 109 <td valign="middle">110 111 <span id="lblDeptAddress"></span></td>112 113 </tr>114 115 </table>

最终转成的javabean对象如下:

publicclassUser implementsSerializable{
/**
* serialVersionUID
*/privatestaticfinallongserialVersionUID =5014957386430143870L;
privateString name;
privateString code;
privatebooleanisMan;
privateString email;
privateString msn;
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name =name;
}
publicString getCode() {
returncode;
}
publicvoidsetCode(String code) {
this.code =code;
}
publicbooleanisMan() {
returnisMan;
}
publicvoidsetMan(booleanisMan) {
this.isMan =isMan;
}
publicString getEmail() {
returnemail;
}
publicvoidsetEmail(String email) {
this.email =email;
}
publicString getMsn() {
returnmsn;
}
publicvoidsetMsn(String msn) {
this.msn =msn;
}
}

这样就可以用以下的代码调用这个组件了:

publicvoidtestParse() throwsIOException{
String resource
="h2j_config.xml";
Reader reader
=Resources.getResourceAsReader(resource);
Html2JavabeanClient client
=Html2JavabeanClientBuilder.buildSqlMapClient(reader);
StringWriter sw
=newStringWriter();
InputStream is
=Resources.getResourceAsStream("oneuser.html");
BufferedReader reader1
=newBufferedReader(newInputStreamReader(is));
String temp
=null;
while((temp =reader1.readLine()) !=null){
sw.write(temp);
}
reader1.close();
User u
=(User)client.parseForObject("user1", sw.getBuffer().toString());
System.out.println(u.getName()
+""+u.getCode());
}

感觉使用起来很像ibatis是吧,因为我这个组件就是拿的ibatis里解析xml的代码改的,学习ibatis源码的时候有了这个想法。
如果有人遇到这种情况的项目不得不解析很多html的话,这种组件想法还是不错的。有需要的可以参考下我写的代码,然后自己写个,我的代码其其实没有写完,只是实验性的做了个demo。如果需要交流的可以email我。
又想起了广州岑村高科和那帮兄弟一起的日子。
项目代码地址:
http://code.google.com/p/html2javabean/

免责声明:文章转载自《html2javabean》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用TopShelf轻松开发Window服务codevs1314 寻宝下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#6.0语言规范(十二) 数组

数组是一种数据结构,包含许多通过计算索引访问的变量。包含在数组中的变量(也称为数组的元素)都是相同的类型,这种类型称为数组的元素类型。 数组具有确定与每个数组元素相关联的索引数的等级。数组的等级也称为数组的维度。秩为1的数组称为一维数组。秩大于1的数组称为多维数组。特定大小的多维阵列通常被称为二维阵列,三维阵列等。 数组的每个维度具有相关联的长度,该长度是...

【用户行为分析】-Java端埋点

需求 在Java后端登录处埋点,获取的事件属性包括:是否成功,登录方式以及神策预置属性。并进行用户ID的打通,使用神策接口把用户匿名ID和登录ID进行打通。 什么是用户ID打通? 用户有时会再注册或登录之前,会在页面进行一些操作,此时会获取一个匿名ID(设备ID或其他)作为用户标识;在用户登录后,会用登录ID作为用户标识;在用户ID打通后,也就是匿名ID和...

关于WinForm/Web如何使用缓存Cach

Cache 的绝对到期与滑动到期 绝对到期:设置绝对过期时间 到了指定时间以后会失效。(类似Cookie机制) 相对到期也称滑动到期:设置相对过期时间 指定时间内无访问会失效。(类似Session机制) HttpRuntime.Cache与HttpContext.Current.Cache 为同一个对象HttpRuntime.Cache.Add 存在相同...

hive基础1

Hive基础 1、介绍 Hive是OLAP(online analyze process,在线分析处理)。通常称为数据仓库,简称数仓。内置很多分析函数,可进行海量数据的在线分析处理。hive构建在hadoop之上,使用hdfs作为进行存储,计算过程采用的是Mapreduce完成,本质上hive是对hadoop的mr的封装,通过原始的mr方式进行数据处理与分...

UpdatePanel控件使用详解(二)

用编程的方法控制UpdatePanel的更新 于UpdatePanel,我们也可以使用编程的方法来控制它的更新,可以通过ScriptManager的RegisterAsyncPostBackControl()方法注册一个异步提交的控件,并且调用UpdatePanel的Update()方法来让它更新。再次用我在前面的文章中用到的一个无聊的时间更新例子来看一下,...

vb中从域名得到IP及从IP得到域名

'vb中从域名得到IP及从IP得到域名 Private Const WS_VERSION_REQD = &H101 Private Const WS_VERSION_MAJOR = WS_VERSION_REQD &H100 And &HFF& Private Const WS_VERSION_MINOR =...