`
huibin
  • 浏览: 750729 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

FreeMarker直接读取XML数据源

阅读更多

引用

1 freemarker.ext.dom.NodeModel.parse这个方法将把xml文件处理成map树状结构的模型;该方法支持以File对象,读xml;也提供了一个流适配器,从面能用InsputStream流对象读xml文件。

2 Map root = new HashMap();
root.put(”doc”, freemarker.ext.dom.NodeModel.parse( ins));
这里要注意:经处理后:”doc”,在数据模型中是根;而xml文件的根是它的子节点;
在读数据时,要从doc开始,否则出错。当然,”doc”也可改成其他名字。

3 增加了一个recurse指令。
FreeMarker这样处理的xml结构的数据模型的:
(1) 按层定义宏;宏名—就是节点名。(这是强行约定的)
(2) recurse—-将循环调用处理子节点的宏

下面是在java应用程序中,应用freemarker的示例:

(1) ddd.xml
注意:ddd.xml位于classpath下的jap1文件夹下,与下面的 FMtest.java的位置相同。在netbean开发环境中,位于 src\java\jsp1下。[size=medium]

Xml代码

张三1111

李四hhhh

张三1111

李四hhhh

(2) FMTest.java ——-应用freemarker的类

Java代码
package jap1;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class FMTest {

public static void main(String[] args) throws Exception {
FMTest test=new FMTest();
test.getFile();
}

@SuppressWarnings(”empty-statement”)
public void getFile() throws IOException, TemplateException,
SAXException, ParserConfigurationException{

//得FreeMarker配置对象
Configuration cfg = new Configuration();
cfg.setEncoding(Locale.getDefault(), “UTF-8″);
cfg.setClassForTemplateLoading(this.getClass(),”/jap1″);
//得FreeMarker的关键对象———模板
Template temp = cfg.getTemplate(”test.ftl”);

//得FMTest类运行时/jap1/ddd.xml的输入流文件,以便FreeMarker读出来
//注意:FMTest运行时,ddd.xml在工程打包的包中。Java强烈要求只能读包内
//文件。如果要得到运行的绝对路径,再用可写的流打包,java会严重抗议!
InputStream in =FMTest.class.getResourceAsStream(”/jap1/ddd.xml”);
//下面是FreeMarker的输入接口,这里与上面的in流建立关系,
//以便读取ddd.xml文件
InputSource ins=new org.xml.sax.InputSource(in);

Map root = new HashMap();
//特别注意此时的doc,这个符号将是,FreeMarker模板中取数的根!!!!!
//这里读取xml文件,并处理成root对象
root.put(”doc”, freemarker.ext.dom.NodeModel.parse( ins));

//建立内存字符串流
java.io.StringWriter w =new StringWriter();
//模板开始按模板中的要求把用户输入的数据进行转换,并输出到字符串流中
temp.process(root, w);
//字符串流输出到屏幕
System.out.println(w.toString());
}

}

package jap1;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class FMTest {

public static void main(String[] args) throws Exception {
FMTest test=new FMTest();
test.getFile();
}

@SuppressWarnings(”empty-statement”)
public void getFile() throws IOException, TemplateException,
SAXException, ParserConfigurationException{

//得FreeMarker配置对象
Configuration cfg = new Configuration();
cfg.setEncoding(Locale.getDefault(), “UTF-8″);
cfg.setClassForTemplateLoading(this.getClass(),”/jap1″);
//得FreeMarker的关键对象———模板
Template temp = cfg.getTemplate(”test.ftl”);

//得FMTest类运行时/jap1/ddd.xml的输入流文件,以便FreeMarker读出来
//注意:FMTest运行时,ddd.xml在工程打包的包中。Java强烈要求只能读包内
//文件。如果要得到运行的绝对路径,再用可写的流打包,java会严重抗议!
InputStream in =FMTest.class.getResourceAsStream(”/jap1/ddd.xml”);
//下面是FreeMarker的输入接口,这里与上面的in流建立关系,
//以便读取ddd.xml文件
InputSource ins=new org.xml.sax.InputSource(in);

Map root = new HashMap();
//特别注意此时的doc,这个符号将是,FreeMarker模板中取数的根!!!!!
//这里读取xml文件,并处理成root对象
root.put(”doc”, freemarker.ext.dom.NodeModel.parse( ins));

//建立内存字符串流
java.io.StringWriter w =new StringWriter();
//模板开始按模板中的要求把用户输入的数据进行转换,并输出到字符串流中
temp.process(root, w);
//字符串流输出到屏幕
System.out.println(w.toString());
}

}

(3) test.ftl ——–模板文件
Xml代码
测试单个读数操作—–${doc.root.user[0].name}

列表测试:
<#list doc.root.user as dd>
${dd.name}
</#LIST>

<#--recurse指令,按层读取整个xml节点,并循环调用处理这些节点的宏-->
<#recurse doc><#--root是doc的子节点,这里将循环调用<#marco root>宏 –>
读doc
<#macro root>
读root <#recurse><#--user是root的子节点,这里将循环调用<#marco user>宏 –>
</#MACRO>
<#macro user>
姓名:${.node.name};测试recurse指令,user
</#MACRO>

测试单个读数操作—–${doc.root.user[0].name}

列表测试:
<#list doc.root.user as dd>
${dd.name}
</#LIST>

<#--recurse指令,按层读取整个xml节点,并循环调用处理这些节点的宏-->
<#recurse doc><#--root是doc的子节点,这里将循环调用<#marco root>宏 –>
读doc
<#macro root>
读root <#recurse><#--user是root的子节点,这里将循环调用<#marco user>宏 –>
</#MACRO>
<#macro user>
姓名:${.node.name};测试recurse指令,user
</#MACRO>

(4) 运行结果

Java代码
测试单个读数操作—–张三1111

列表测试:
张三1111
李四hhhh

读root
姓名:张三1111;测试recurse指令,user

姓名:李四hhhh;测试recurse指令,user

读doc

分享到:
评论

相关推荐

    freemarker+itext生成PDF

    4. **生成PDF**:使用Itext读取FreeMarker处理后的结果,并将其转换为PDF文档。 在给定的文件列表中,`pom.xml`可能是Maven项目的依赖管理文件,其中会包含FreeMarker和Itext的依赖项。`src`则包含了源代码,可能...

    Xml做数据源模板显示新闻的源码.rar

    总结来说,这个源码示例主要展示了如何使用XML作为数据源,结合Java的XML解析技术和FreeMarker模板引擎,实现一个新闻显示系统。这涵盖了XML解析、数据模型构建、模板引擎使用等多个关键知识点,对于理解和开发类似...

    使用freemarker生成word文档,源代码+jar包+说明文档及注意事项

    也就是说,不要在word里首先打完 ${ } 之后,又从其它地方把 string 字符串粘贴至 { } 之间,这样在 word 转化为 xml时,解析会有问题,freemarker解析时,会报错。 /** * @Desc:生成word文件 * @Author:张轮...

    Freemarker生成word文档

    2. XML数据源 XML是一种结构化数据格式,常用于存储和交换数据。在生成Word文档的过程中,XML文件可以作为数据模型,其中的标签和属性对应于Word文档的各个元素,如段落、标题、图片等。通过解析XML文件,我们可以...

    freemarker 中文乱码解决

    4. 如果仍然存在问题,检查系统环境变量和数据模型的编码,确保数据源的编码与项目编码相匹配。 5. 最后,尝试统一项目编码为UTF-8,这是最简单且最有效的解决方案。 通过上述方法,可以有效地解决Freemarker中出现...

    一个意义深刻 FreeMarker 入门例子之HelloWord

    - 主类:通常包含`main`方法,是程序的入口点,负责初始化FreeMarker环境,读取数据,调用FreeMarker模板进行渲染。 - 配置文件:可能包含`freemarker.properties`或`application.properties`等,用于设置...

    java利用FreeMarker导出word

    - 在这个场景中,POI用于读取Word文档(`.docx`格式其实是ZIP压缩包,包含XML文件),将其内容解析为Java对象,然后这些对象可以作为数据模型供FreeMarker使用。 5. **模板设计**: - FreeMarker模板设计时,需要...

    freemarker-2.3.30模板word导出.zip

    这些模板与实际数据源(如Java对象)结合后,可以生成动态内容。模板设计时与业务逻辑分离,使得模板的修改和维护更为便捷。 2. **Freemarker 2.3.30版本**: 这个版本是Freemarker的一个稳定版本,发布于某个时间...

    Java freemarker 模板生成word动态表格

    9. **实际应用**:这种技术常用于报告自动化、批量生成合同或者数据分析报告等场景,特别是在需要根据数据库或其他数据源动态生成内容时。 总结来说,Java FreeMarker模板生成Word动态表格是通过结合FreeMarker模板...

    freemarker解析成pdf

    4. **读取模板**:使用配置好的Freemarker加载模板文件。 ```java Template template = cfg.getTemplate("report.ftl"); ``` 5. **生成PDF**:使用Freemarker的`process`方法将模板和数据模型结合,然后通过一个...

    freemarker 生成docx word所需jar

    这将作为模板填充的数据源。 3. 加载Freemarker配置:使用`Configuration`类加载模板文件,并设置数据模型。 4. 使用Freemarker生成XML:通过`Template`类的`process()`方法,将数据模型应用到模板上,生成一个XML...

    使用freemarker模版引擎自动生成java项目源代码.zip

    3. **运行FreeMarker**:使用FreeMarker API读取模板和数据模型,生成最终的Java源代码文件。 4. **整合到构建流程**:将FreeMarker集成到项目构建流程,如在Maven的生成阶段或Gradle的任务中运行,使得每次构建时都...

    freemarker-excel.zip

    为了更好地理解这个过程,你可以查阅`freemarker-excel.zip`中的源代码,它应该包含一个示例模板、Java代码以及可能的测试数据。通过学习和分析这个例子,你可以快速掌握如何在实际项目中实现这个功能。同时,记得...

    java+Freemarker生成word

    在企业级应用中,这种技术尤其有用,因为它允许开发者根据数据库或其他数据源中的信息自动生成Word文档,无需手动编写。 Java是面向对象的编程语言,而Freemarker则是一个模板引擎,它主要用于生成文本输出,如HTML...

    freemarker无损生成word.pdf

    Freemarker是一个模板引擎,即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,配置文件,源代码等)的通用工具。在Java中,它经常被用于Web开发。为了无损生成Word文档,我们可以采用Freemarker和XML...

    java+freemarker实现对word的操作myeclipse工程Java源码

    本项目利用Java结合Freemarker模板引擎,实现了对Word文档的操作,为开发者提供了便捷的方式来创建、编辑和读取Word文档。 Freemarker是一个强大的、开源的模板引擎,主要用于生成动态内容。它的工作原理是将数据...

    Struts2零配置+FreeMarker用户管理系统(UMS)

    传统的Struts2需要通过struts.xml配置文件来定义动作和结果,但随着版本的更新,它支持了零配置或注解配置,使得开发者可以直接在Action类上使用注解来定义行为。在这个项目中,"零配置"意味着开发者可能没有使用...

    javaword文档导出jar包freemarker.rar

    这包括从数据库或其他数据源获取数据,将数据结构化为Freemarker可以理解的模型,然后使用Freemarker API将模型与模板合并,生成最终的Word文档。 3. **Word文档操作库**: 要在Java中操作Word文档,通常需要依赖...

    Freemarker 学习笔记一 【乱码解决】

    确保数据源的编码与Freemarker和浏览器的编码一致。 5. **Java代码处理**:在Java代码中处理字符串时,需要正确处理字符编码。例如,读取文件时使用`InputStreamReader`指定编码,输出到流时使用`...

Global site tag (gtag.js) - Google Analytics