历史版本13 :解析数据库内xml文件 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 问题描述编辑

数据库表,其中字段 XML 所存的为 XML 格式数据在表 xmltest 中,如下图,在使用该表进行报表制作时,需要将存于XML 字段中的值读取出来作为报表数据源。


222
XML 每条记录数据格式如下:

<Field><Name>MemoryFreeSize</Name><Type>int</Type><Value>1962</Value></Field> <Field><Name>MemoryTotalSize</Name><Type>int</Type><Value>2047</Value></Field> <Field><Name>MemoryUsage</Name><Type>int</Type><Value>4</Value></Field>
<Field><Name>MemoryFreeSize</Name><Type>Int</Type><Value>1999</Value></Field> <Field><Name>MemoryTotalSize</Name><Type>Int</Type><Value>2048</Value></Field> <Field><Name>MemoryUsage</Name><Type>Int</Type><Value>10</Value></Field>
<Field><Name>MemoryFreeSize</Name><Type>Int</Type><Value>2000</Value></Field> <Field><Name>MemoryTotalSize</Name><Type>Int</Type><Value>2050</Value></Field> <Field><Name>MemoryUsage</Name><Type>Int</Type><Value>15</Value></Field>

最终用于制作报表的数据源形式如下:
222

对于这样的情况我们如何来实现呢?
FineReport 中可以通过自定义程序数据集来对 XML 字段数据进行解析,最终返回所希望的数据表。实现步骤如下:


2. 实现原理编辑

FineReport 报表的数据来源可以是任何类型的数据,因为 FineReport 是通过 AbstractTableData 抽象类来读取数据源的,因此用户只要实现了 AbstractTableData 抽象类,也就可以用自定义类型的程序数据集,AbstractTableData 抽象类主要有5个方法,具体使用可参考 简单程序数据集 实现原理文档,数据来源是通过把xml格式数据转入 ArrayList 中。


3. 实现步骤编辑

3.1 数据集初始化方法 init()

连接目标数据库后,执行sql查询语句,将 xmltest 表数据全部查询出来,对于 ID、NAME 字段的值我们将其直接存于新的结果集 ArrayList 中,对于 XML 字段我们通过GetXmlDate类对其进行解析后再转入 ArrayList 中。

GetXmlDate 类代码详见:

https://code.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/data/GetXmlDate.java


3.2 定义程序数据集

定义类 XMLRead.java,继承 AbstractTableData 接口,实现 getColumnCount、getColumnName、getRowCount、getValueAt 四个方法;
XMLRead.java 类代码详见:

https://code.fanruan.com/demo/example/src/release/10.0/src/main/java/com/fr/data/XMLRead.java

注:上述代码中的数据库连接需要改成你自己存放 xmltest 表的数据库


3.3 编译程序数据源

首先编译 GetXmlDate.java 然后再编译 XMLRead.java,将生成的 class 文件放于WEB-INF/classes/com/fr/data下。
222


3.4 配置程序数据源

新建报表,报表数据集>程序数据集,选择我们定义好的程序数据集 XMLRead.class 文件,名字可以自定义,如 ds1。


3.5 使用程序数据源

制作报表保存为 xmlread.cpt,如下:

222

B/S 访问报表,效果如下:

数据库表字段为 XML 类型的数据就可以转换报表数据源了。