历史版本12 :解析某个目录下 XML 文件 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 描述编辑

使用场景:电脑某个目录下保存了几个 XML 文件,希望把 XML 文件转换为报表数据源。

其中 Northwind.xml 记录数据格式如下:


<?xml version="1.0" encoding="UTF-8"?>
<Northwind>
    <Customers>
    <CustomerID>ALFKI</CustomerID>
<CompanyName>ALfreds Futterkiste</CompanyName>
<ContactName>Maria Anders</ContactName>
<ContactTitle>Sales Representative</ContactTitle>
<Address>Obere Str.57</Address>
<City>Berlin</City>
<PostalCode>12209</PostalCode>
<Country>Germany</Country>
<Phone>030-0074321</Phone>
<Fax>030-0076545</Fax>
</Customers>
</Northwind>

最终实现根据不同的文件名动态获取不同的 XML 中的内容作为报表数据源,如下图所示:

222

2. 实现思路编辑

FineReport 中可以通过自定义程序数据集来对 XML 字段数据进行解析,再通过参数的方式,动态获取 XML 文件名,最终作为报表数据源。


3. 操作步骤编辑

2.1 定义 XMLColumnNameType4Demo 封装类

首先定义参数 name 及 type ,供其他类直接调用,安全性比较高,详细代码如下所示:

https://git.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/data/XMLColumnNameType4Demo.java


2.2 定义 XMLParseDemoDataModel.java 类文件

定义 XMLParseDemoDataModel.java 类继承 AbstractDataModel 接口,实现 getColumnCount、getColumnName、getRowCount、getValueAt 四个方法,详细代码如下所示:

https://git.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/data/XMLParseDemoDataModel.java


2.3 定义程序数据集 XMLDemoTableData

通过参数 $filename,动态显示 XML 文件内容,首先 XML 文件需要放到某个目录下,如下代码是放到/Users/susie/Downloads/,并且定义需要解析的数据列,这边定义的数据列名称,跟 XML 内字段名称是一一对用的。

详细代码如下所示:

https://git.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/data/XMLDemoTableData.java

注:如果 XML 文件的格式与问题描述处所展示的 XML 格式不一致,则需要修改类中的 deep 变量,把列名所在的节点层数改成相对应的数值。


2.4 编译程序数据源

可以在 Eclipse 或 IntelliJ IDEA 中编译上述 Java 文件,注意需要引入 FineReport 设计器下的 JAR 包,详细点击 Eclipse中启动设计器

注:XML 的文件路径也需要根据实际情况修改,例如下载到 D 盘,即D://

分别编译 XMLColumnNameType4Demo.java、XMLParseDemoDataModel.java、XMLDemoTableData.java 三个类文件,将生成的 class 文件放置于%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\data 下。


2.5 配置程序数据源

新建程序数据集,如下图所示:

image.png

选择我们定义好的程序数据集 XMLDemoTableData.class文件,添加数据集默认参数 filename,值为 Northwind,如下图所示:

222

2.6 使用程序数据源

在模板数据集窗口,点击预览按钮,弹出参数对话框,输入要显示的 XML 文件名称,点击确定则可以把 Northwind.xml 文件里面的数据读取出来转换报表数据源了,如下图:
222