代码生成工具-解读(1)

本文介绍了一种使用Anakia和Velocity根据XML文件动态生成HTML的方法。通过定义模板文件,可以轻松地将XML数据转换成HTML格式,适用于快速生成文档。
引言:  
   这里的代码生成工具,实质上就是根据一个xml文件生成.java或者.html文件或者.jsp文件。这里采用了一个工具Anakia,他依赖于Velocity。

效果:
     动态生成一个html文件这个文件是以vsl文件为模版,并且读取了xml文件中的信息来生成的。
这样就可以根据一个xml文件动态生成html、jsp、java文件了,当然这需要自己定义相应的模版文件。

1. 模版文件或者叫样式文件 test.vsl
需要处理的xml文件,动态数据存在的文件 test.xml
  1.   
  2.     ## Defined variables   
  3.     #set ($bodybg = "#ffffff")   
  4.     #set ($bodyfg = "#000000")   
  5.     #set ($bodylink = "#525D76")   
  6.     #set ($bannerbg = "#525D76")   
  7.     #set ($bannerfg = "#ffffff")   
  8.     #set ($tablethbg = "#039acc")   
  9.     #set ($tabletdbg = "#a0ddf0")   
  10.   
  11. #document()   
  12.   
  13. #macro ( image $value )   
  14. #if ($value.getAttributeValue("width"))   
  15. #set ($width=$value.getAttributeValue("width"))   
  16. #end   
  17. #if ($value.getAttributeValue("height"))   
  18. #set ($height=$value.getAttributeValue("height"))   
  19. #end   
  20. #if ($value.getAttributeValue("align"))   
  21. #set ($align=$value.getAttributeValue("align"))   
  22. #end   
  23. <img src="$relativePath$value.getAttributeValue("src")" width="$!width" height="$!height" align="$!align">  
  24. #end   
  25. #macro (document)   
  26.     <html>  
  27.         <head>  
  28.             <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>  
  29.         head>  
  30.         <body bgcolor="$bodybg" text="$bodyfg" link="$bodylink">  
  31.             <table border="1">  
  32.                 <tr>  
  33.                 <td>  
  34. sdsd   
  35.                 td>  
  36.                 <td>  
  37.                 #set ($allSections = $xpath.applyTo("body/section", $root))   
  38.                 #foreach ( $section in $allSections )   
  39.                     #foreach ( $item in $section.getChildren() )   
  40.                         #if ($item.getName().equals("img"))   
  41.                             #image ($item)   
  42.                         #else   
  43.                             $xmlout.outputString($item)   
  44.                         #end   
  45.                     #end   
  46.                 #end   
  47.                 td>  
  48.                 tr>  
  49.             table>  
  50.         body>  
  51.     html>  
  52. #end   

2. 公共数据所在文件 test.xml
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <document>  
  3. <body>  
  4.   <section name="Section 1">  
  5. <p>  
  6. This is an example template that gets processed.   
  7. p>  
  8. <img src="/images/velocity.gif" width="329" height="105"/>  
  9. <table border="1">  
  10. <tr>  
  11.     <td>  
  12.         It even has a table in it!   
  13.     td>  
  14. tr>  
  15. table>  
  16. <h3>And an h3 tagh3>  
  17.   section>  
  18.     <section name="Section 2">  
  19.     <p> here is another section p>  
  20.     section>  
  21.     <section name="section 3">  
  22.     <p><a href="./about/index.html">A link to a sub pagea>p>  
  23.     section>  
  24. body>  
  25. document>  

3.  build.xml
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <project name="build-site" default="docs" basedir=".">  
  3.   
  4.       
  5.     <property name="project.name"   value="site"/>  
  6.     <property name="docs.src" value="../xdocs"/>  
  7.     <property name="docs.dest" value="../docs"/>  
  8.   
  9.       
  10.     <path id="classpath">  
  11.         <fileset dir="../../../build/lib">  
  12.             <include name="**/*.jar"/>  
  13.         fileset>  
  14.         <fileset dir="../../../bin">  
  15.             <include name="**/*.jar"/>  
  16.         fileset>  
  17.     path>  
  18.   
  19.     <target name="prepare">  
  20.         <available classname="org.apache.velocity.anakia.AnakiaTask"  
  21.                     property="AnakiaTask.present">  
  22.            <classpath refid = "classpath"/>  
  23.         available>  
  24.     target>  
  25.   
  26.     <target depends="prepare" name="prepare-check" unless="AnakiaTask.present">  
  27.         <echo>  
  28.             ERROR : AnakiaTask is not present! Please check to make sure that   
  29.             velocity.jar is in your classpath.   
  30.         echo>  
  31.     target>  
  32.   
  33.     <target name="docs" depends="prepare-check" if="AnakiaTask.present">  
  34.         <taskdef name="anakia"  
  35.             classname="org.apache.velocity.anakia.AnakiaTask">  
  36.            <classpath refid = "classpath"/>  
  37.         taskdef>  
  38.         <anakia basedir="${docs.src}" destdir="${docs.dest}/"  
  39.              extension=".html" style="./test.vsl"  
  40.              excludes="**/stylesheets/**"  
  41.              includes="**/test.xml"  
  42.              lastModifiedCheck="true"  
  43.              templatePath="../xdocs/stylesheets"  
  44.         >  
  45.         anakia>  
  46.   
  47.         <copy todir="${docs.dest}/images" filtering="no">  
  48.             <fileset dir="${docs.src}/images">  
  49.                 <include name="**/*.gif"/>  
  50.                 <include name="**/*.jpeg"/>  
  51.                 <include name="**/*.jpg"/>  
  52.             fileset>  
  53.         copy>  
  54.         
  55.         <copy todir="${docs.dest}" filtering="no">  
  56.             <fileset dir="${docs.src}">  
  57.                 <include name="**/*.css"/>  
  58.             fileset>  
  59.         copy>  
  60.         -->  
  61.     target>  
  62. project>  

 总结:
  可见只要你提取出代码中的公共信息,将其定义为模版这样就可以利用一个xml文件生成出所需的文件了。 
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值