FineReport中如何解析数据库中的XML文件

分类:编程技术 时间:2024-02-20 15:25 浏览:0 评论:0
0
本文与大家分享如何在FineReport中解析数据库中的XML文件。小编觉得还是比较实用的,所以分享给大家学习一下。希望您读完本文后有所收获。话不多说,直接关注即可。我们一起来看看吧。

数据库表中,字段XML以xml格式存储数据在表xmltest中。那么在使用这张表进行报表制作时,需要读取xml字段中存储的值作为报表数据源。

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

MemoryFreeSizeint<值>1962

<字段><名称>MemoryTotalSize<类型>int<值>2047

MemoryUsageint4 ;

<名称> MemoryFreeSize <类型> Int <值> 1999

<字段> <名称> MemoryTotalSize <类型> Int <值>2048

<字段>MemoryUsageInt10;

MemoryFreeSizeInt2000

MemoryTotalSizeInt2050

<字段><名称>MemoryUsage<类型>Int<值>15

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

这样的情况如何实现? FineReport可以通过自定义程序数据集解析xml字段数据,最终返回想要的数据报表。

FineReport的数据源可以是任何类型的数据。因此,FineReport使用了AbstractTableData抽象类,这意味着它可以使用自定义类型的程序数据集。数据源是通过将xml格式数据转换成ArrayList。

数据集初始化方法init()

连接目标数据库后,执行sql查询语句,查询xmltest表所有数据。对于身份证件和NAME字段的值将直接存储在新结果集ArrayList中。对于xml字段,通过GetXmlDate类进行解析,然后转入ArrayList。

GetXmlDate类代码如下:

package com.fr.data;导入 java.io.InputStream;导入 java.io.InputStreamReader ;导入java.io.Reader;导入java.util.logging.Level;导入com.fr.base.FRContext;导入 com.fr.stable.xml.XMLReadable;导入 com.fr.stable.xml.XMLableReader; public class GetXmlDate { // 定义返回值数组 private String[] Value = new String[3]; // 定义查询的name值 private String[] Name = null; protected String[] readerXMLSource(InputStream in, String[] name) 抛出异常 {Name = name; InputStreamReader reader = new InputStreamReader(in, "utf-8"); readXMLSource(阅读器);返回值; protected void readXMLSource(Reader) reader) 抛出异常 { XMLableReader xmlReader = XMLableReader.createXML能够阅读器(阅读器); if ( xmlReader != null) {                                    sp; xmlReader.readXMLObject(new Content()); if (reader.isChildNode()) { if (reader.getTagName().equals("Field" )) { Field field = new Field();reader.readXMLObject(field); }​ .值; } else if (Name[1].equals(field.name)) {                                             sp;值[1]                                                                                                                                                                                         } // 定义每个字段的结构 private class Fieldimplements XMLReadable { private String name;私有字符串类型;私有字符串价值; public void readXML(XMLableReader reader) { if (reader.isChildNode()) { String tagName = reader .getTagName(); }   this.type = reader.getElementValue(); else if (tagName.equals("Value")) {                                              bsp; this.value = reader.getElementValue();定义程序数据集

定义类XMLRead。 java,继承于AbstractTableData接口,实现了四个方法:getColumnCount、getColumnName、getRowCount、getValueAt;
XMLRead.java类代码如下:

 com.fr.data 包;导入 java.io.InputStream;导入 java.io.StringBufferInputStream;导入java.sql.Connection;导入 java.sql.DriverManager;导入java.sql.ResultSet;导入java.sql.Statement;导入java.util.ArrayList;导入com.fr.data.AbstractTableData; public class XMLRead extends AbstractTableData { // 列名数组,保存程序数据集的所有列名 private String[] columnNames = { "id", "name", "MemoryFreeSize", "MemoryTotalSize", "MemoryUsage" }; // 保存表数据 private ArrayList valueList = null; public int getColumnCount() () Return 5;} Public String GetColumnname (INT COLUMNINDEX) {Return Columnnames [ColumnNindex];} Public Int GetRowCount () {);依靠 ();依赖转valuelist.size();} Public Object GetValueat(Int Rowindex, INT COLUMNINDEX) {                                  ;在里面(); return ((Object[]) valueList.get(rowIndex))[columnIndex]; private void init() { // 确保只执行一次 if (valueList != null) {                 return;新的ArrayList(); String sql = "从 xmltest 选择*"; String[] name = { "MemoryFreeSize", "MemoryTotalSize", "MemoryUsage" };连接 conn = this.getConncetion();尝试 { 语句 stmt = conn.createState ment();结果集 rs = stmt.executeQuery(sql) ; ;同时(rs.next()) { objArray = 新对象[5];字符串[] xmldata = null; objArray[0] = rs.getObject(1); ''''s's's's s s 1' StringBufferInputStream(""             + rs.getObject(3).toString() + ""); GetXmlDate getxmldata = new GetXmlDate(); // 解析xml流,返回name对应的value数组 xmldata = getxmldata .readerxmlsource(in, name); // 将解析后的值保存在最终结果 Objarray[2] = xmlData[0];  对象数组[3]rs.close(); 。 (); } catch (异常 e) {                                                                                                                                   OracleDriver"; 字符串 url = "jdbc:oracle:thin:@192.168.100.169: 1521:orcl10g"; 字符串用户名 = "temp"; 字符串密码 = "temp123";   连接 con = null; 尝试{ Class.forName(driverName); con = DriverManager.getConnection(url, username, password); } catch (Exception e) {            e.printStackTrace();              return null;p;                                  // 释放一些资源,因为可能会有重复调用,所以需要释放valueList,释放上次查询的结果} }

上面代码中的数据库连接改变了自己归档xmltest表的数据库

编译程序数据源

首先编译GetXmlDate。 java然后编译XMLRead.java并将生成的类文件放在WEB-INF/classes/com/fr/data下。

配置程序数据源

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

使用程序数据源

创建报告并将其另存为xmlread.cpt,如下:

BS访问报表,效果如下:

以上是如何在FineReport中解析数据库中的XML文件。小编相信,有些知识点在我们日常工作中可能会见到。或使用过。希望您能从本文中了解更多信息。了解更多详情,请支付关注行业信息渠道。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > FineReport中如何解析数据库中的XML文件

用户评论