转载必须注明文章来源:renjie120.iteye.com
关于freemarker的recurse的用途,在百度和中文指南中,有很多的说明,都是千篇一律。
找了半天却没有找到关于如何具体对一个xml进行遍历解析的例子。
这里给出一个示例的例子:
xml文件:
<book> <title>spring & struts2 & hibernate</title> <chapter author="周润发" address="上海"> <title>第一章</title> <para>1.1节</para> <para>1.2节</para> </chapter> <chapter author="刘德华" time="2013-1-1"> <title>第二章</title> <para>2.1节</para> <para>2.2节</para> <para>2.3节</para> </chapter> </book>
ftl文件:
<#compress> <#recurse doc> <#macro book> 欢迎使用本书籍---------------<#recurse> </#macro> <#macro title> 标题 《<#recurse>》 </#macro> <#macro chapter> <#-- <#if .node.@address??> 地点:${.node.@address}</#if> --> ----作者:${.node.@author} <#if .node.@time[0]?? >创作时间:${.node.@time}</#if> <#if .node.@address[0]?? >创作地点:${.node.@address}</#if> <#recurse> </#macro> <#macro para> 细节: <#recurse> </#macro> </#compress>
java代码:
public class XmlMarkerTest { public static void main(String[] agrgs) { Writer out = new OutputStreamWriter(System.out); new Generate("book.ftl", out) { public Object setData() { Map m = new HashMap(); try { m.put("doc", freemarker.ext.dom.NodeModel.parse(new File( "D:\\My Documents\\GitHub\\dwz_money\\template\\data.xml"))); } catch (Exception e) { e.printStackTrace(); } return m; } }.make(); System.out.println("\n\n生成完毕"); } }
package common.codegenerate; import java.io.File; import java.io.IOException; import java.io.Writer; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import freemarker.template.TemplateException; public abstract class Generate { String ftlname; Writer out; public Generate(String ftlname, Writer out) { this.ftlname = ftlname; this.out = out; } abstract Object setData(); public void make() { try { Configuration cfg = new Configuration(); File f = new File("template"); cfg.setDirectoryForTemplateLoading(f); cfg.setObjectWrapper(new DefaultObjectWrapper()); Template temp = cfg.getTemplate(ftlname); Object data = setData(); temp.process(data, out); out.flush(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } } }
输出结果:
欢迎使用本书籍---------------
标题 《spring & struts2 & hibernate》
标题 《第一章》
细节: 1.1节
细节: 1.2节
----作者:周润发 创作地点:上海
标题 《第一章》
细节: 1.1节
细节: 1.2节
----作者:刘德华 创作时间:2013-1-1
标题 《第二章》
细节: 2.1节
细节: 2.2节
细节: 2.3节
说明:对于recurse指令,会从根对象“doc”(因为java代码中设置的根对象时doc)开始进行网下逐层级的解析xml,首先第一层是“book”,第二层是“title”,“chapter”,第三层是“para”,“title”.
访问了一层的话,要访问后面的层次的话,必须再继续嵌套使用<#recurse>。
访问xml节点的属性,使用.@属性名。判断属性是否存在,使用方式见ftl中。
转载必须注明文章来源:renjie120.iteye.com
相关推荐
在这个示例中,`${user}`、`${latestProduct.url}`和`${latestProduct.name}`都是FreeMarker的指令,它们将在最终输出时被对应的数据模型中的实际值替换。这样的设计允许设计师专注于页面布局和样式,而程序员则关注...
- **定位与功能**:FreeMarker是一款基于模板的通用工具,旨在帮助开发者利用模板生成各类文本输出,包括但不限于HTML网页、XML文档、RTF文件及Java源代码等。 - **适用场景**:虽然最初设计用于生成HTML网页,尤其...
- **跨领域适用性**:虽然FreeMarker最初是为了生成HTML页面而设计的,但它同样可以用于生成其他类型的文本输出,如XML、RTF、Java源代码等。 ##### 特点 - **独立性**:FreeMarker与容器无关,即它不知道HTTP或...
以下是一个简单的示例,展示了如何使用 Freemarker 来生成包含动态数据的 HTML 页面: ```html <title>Welcome! <h1>Welcome ${user}! <p>Our latest product: ${latestProduct.url}">${latestProduct.name...
#### 四、FreeMarker设计指南与示例 1. **快速入门**:在FreeMarker中,模板与数据模型相结合生成最终输出。设计者负责创建模板,而程序员负责生成数据模型。 - **模板示例**: ```html <title>Welcome! ...
- **示例模板**: 下面是一个简单的 HTML 示例,其中包含了 FreeMarker 指令,用于展示用户信息和最新产品的链接。 ```html <title>Welcome! <h1>Welcome ${user}! <p>Our latest product: ${...
- 支持递归遍历XML树的`<#recurse>`和`<#visit>`指令。 - 提供直观的方式在模板中访问XML对象模型。 #### 三、FreeMarker设计指南 1. **快速入门** - **模板+数据模型=输出**: 在Web开发中,设计师负责创建...
2.1 通过例子来学习:通过具体示例,学习如何在FreeMarker模板中处理XML。 2.2 形式化描述:对如何处理XML给出了形式化的定义。 三、声明的XML处理 3.1 基础内容:讲述了如何在FreeMarker中进行声明式的XML处理。 ...
为了更好地理解FreeMarker的实际应用,这里给出一个简单的示例: 1. **项目搭建**:创建一个名为`testFreeMarker`的Java项目。 2. **引入依赖**:向项目中添加FreeMarker的jar包。 3. **创建模板**:在项目的`...
- **1.5 将代码放在一起**:提供了完整的示例代码,演示如何将上述步骤整合到一个程序中。 ##### 第二章 数据模型 - **2.1 基本内容**:概述了数据模型的基础知识。 - **2.2 标量**:解释了标量类型的概念及其用途...
在这个示例中,`${user}`和`${latestProduct.url}`以及`${latestProduct.name}`都是FreeMarker的指令,它们将在模板执行时被实际的数据值替换。这种方式使得设计人员可以专注于布局和外观设计,而开发人员则负责数据...
- **高性能**:Freemarker是一个编译型模板引擎,生成的Java代码执行效率高。 6. **应用场景** - Web应用的视图层,如Spring MVC中的Thymeleaf。 - 电子邮件模板生成。 - 文档自动化,如报告生成。 总结起来,...
此外,FreeMarker 还支持 XML 输出,允许用户通过 `<#recurse>` 和 `<#visit>` 指令来处理 XML 结构数据。 ### 四、FreeMarker的高级特性 1. **国际化支持:**FreeMarker 支持国际化,可以方便地切换不同语言版本...
在这个示例中,`${user}`、`${latestProduct.url}` 和 `${latestProduct.name}` 是 Freemarker 的占位符,它们将在运行时被数据模型中的实际值所替换。 #### 三、数据模型详解 数据模型是 Freemarker 中非常重要的...
- **定位与功能**:FreeMarker是一款基于模板的文本生成工具,主要用于生成各类文本输出,如HTML、XML、RTF、Java源代码等。它由纯Java编写,因此可以轻松地集成到Java环境中。 - **适用场景**:尽管其设计初衷是...
- 提供`<#recurse>`和`<#visit>`指令,用于递归遍历XML树。 - 提供直观的模板语言访问XML对象模型。 快速入门示例: FreeMarker的基本用法是将模板与数据模型结合生成输出。例如,HTML模板中包含变量`${user}`和`...
FreeMarker的快速入门示例展示了其基本工作原理:模板(如HTML)中包含特殊指令,当与数据模型结合后,FreeMarker会替换这些指令,生成最终的输出。例如,模板中 `${user}` 和 `${latestProduct.url}` 等占位符会被...