引言:
这里的代码生成工具,实质上就是根据一个xml文件生成.java或者.html文件或者.jsp文件。这里采用了一个工具Anakia,他依赖于Velocity。
效果:
动态生成一个html文件这个文件是以vsl文件为模版,并且读取了xml文件中的信息来生成的。
这样就可以根据一个xml文件动态生成html、jsp、java文件了,当然这需要自己定义相应的模版文件。
1. 模版文件或者叫样式文件 test.vsl 需要处理的xml文件,动态数据存在的文件 test.xml
这里的代码生成工具,实质上就是根据一个xml文件生成.java或者.html文件或者.jsp文件。这里采用了一个工具Anakia,他依赖于Velocity。
效果:
动态生成一个html文件这个文件是以vsl文件为模版,并且读取了xml文件中的信息来生成的。
这样就可以根据一个xml文件动态生成html、jsp、java文件了,当然这需要自己定义相应的模版文件。
1. 模版文件或者叫样式文件 test.vsl 需要处理的xml文件,动态数据存在的文件 test.xml
- ## Defined variables
- #set ($bodybg = "#ffffff")
- #set ($bodyfg = "#000000")
- #set ($bodylink = "#525D76")
- #set ($bannerbg = "#525D76")
- #set ($bannerfg = "#ffffff")
- #set ($tablethbg = "#039acc")
- #set ($tabletdbg = "#a0ddf0")
- #document()
- #macro ( image $value )
- #if ($value.getAttributeValue("width"))
- #set ($width=$value.getAttributeValue("width"))
- #end
- #if ($value.getAttributeValue("height"))
- #set ($height=$value.getAttributeValue("height"))
- #end
- #if ($value.getAttributeValue("align"))
- #set ($align=$value.getAttributeValue("align"))
- #end
- <img src="$relativePath$value.getAttributeValue("src")" width="$!width" height="$!height" align="$!align">
- #end
- #macro (document)
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
- head>
- <body bgcolor="$bodybg" text="$bodyfg" link="$bodylink">
- <table border="1">
- <tr>
- <td>
- sdsd
- td>
- <td>
- #set ($allSections = $xpath.applyTo("body/section", $root))
- #foreach ( $section in $allSections )
- #foreach ( $item in $section.getChildren() )
- #if ($item.getName().equals("img"))
- #image ($item)
- #else
- $xmlout.outputString($item)
- #end
- #end
- #end
- td>
- tr>
- table>
- body>
- html>
- #end
2. 公共数据所在文件 test.xml
- xml version="1.0" encoding="UTF-8"?>
- <document>
- <body>
- <section name="Section 1">
- <p>
- This is an example template that gets processed.
- p>
- <img src="/images/velocity.gif" width="329" height="105"/>
- <table border="1">
- <tr>
- <td>
- It even has a table in it!
- td>
- tr>
- table>
- <h3>And an h3 tagh3>
- section>
- <section name="Section 2">
- <p> here is another section p>
- section>
- <section name="section 3">
- <p><a href="./about/index.html">A link to a sub pagea>p>
- section>
- body>
- document>
3. build.xml
- xml version="1.0" encoding="UTF-8"?>
- <project name="build-site" default="docs" basedir=".">
- <property name="project.name" value="site"/>
- <property name="docs.src" value="../xdocs"/>
- <property name="docs.dest" value="../docs"/>
- <path id="classpath">
- <fileset dir="../../../build/lib">
- <include name="**/*.jar"/>
- fileset>
- <fileset dir="../../../bin">
- <include name="**/*.jar"/>
- fileset>
- path>
- <target name="prepare">
- <available classname="org.apache.velocity.anakia.AnakiaTask"
- property="AnakiaTask.present">
- <classpath refid = "classpath"/>
- available>
- target>
- <target depends="prepare" name="prepare-check" unless="AnakiaTask.present">
- <echo>
- ERROR : AnakiaTask is not present! Please check to make sure that
- velocity.jar is in your classpath.
- echo>
- target>
- <target name="docs" depends="prepare-check" if="AnakiaTask.present">
- <taskdef name="anakia"
- classname="org.apache.velocity.anakia.AnakiaTask">
- <classpath refid = "classpath"/>
- taskdef>
- <anakia basedir="${docs.src}" destdir="${docs.dest}/"
- extension=".html" style="./test.vsl"
- excludes="**/stylesheets/**"
- includes="**/test.xml"
- lastModifiedCheck="true"
- templatePath="../xdocs/stylesheets"
- >
- anakia>
- <copy todir="${docs.dest}/images" filtering="no">
- <fileset dir="${docs.src}/images">
- <include name="**/*.gif"/>
- <include name="**/*.jpeg"/>
- <include name="**/*.jpg"/>
- fileset>
- copy>
- <copy todir="${docs.dest}" filtering="no">
- <fileset dir="${docs.src}">
- <include name="**/*.css"/>
- fileset>
- copy>
- -->
- target>
- project>
总结:
可见只要你提取出代码中的公共信息,将其定义为模版这样就可以利用一个xml文件生成出所需的文件了。