千家信息网

FineReport中怎么解析数据库内XML文件

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇文章给大家分享的是有关FineReport中怎么解析数据库内XML文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在数据库表中,其
千家信息网最后更新 2026年11月02日FineReport中怎么解析数据库内XML文件

本篇文章给大家分享的是有关FineReport中怎么解析数据库内XML文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

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

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

MemoryFreeSizeint1962

MemoryTotalSizeint2047

MemoryUsageint4 ;

MemoryFreeSizeInt1999

MemoryTotalSizeInt2048

MemoryUsageInt10;

MemoryFreeSizeInt2000

MemoryTotalSizeInt2050

MemoryUsageInt15

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

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

帆软报表FineReport的数据来源可以是任何类型的数据,因此FineReport是通过AbstractTableData抽象类,也就可以用自定义类型的程序数据集,数据来源是通过把xml格式数据转入ArrayList中。

数据集初始化方法init()

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

GetXmlDate类代码如下:

package com.fr.data;        import java.io.InputStream;    import java.io.InputStreamReader;    import java.io.Reader;    import java.util.logging.Level;    import com.fr.base.FRContext;     import com.fr.stable.xml.XMLReadable;  import 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)                throws Exception {            Name = name;            InputStreamReader reader = new InputStreamReader(in, "utf-8");            readXMLSource(reader);            return Value;        }            protected void readXMLSource(Reader reader) throws Exception {            XMLableReader xmlReader = XMLableReader.createXMLableReader(reader);            if (xmlReader != null) {                xmlReader.readXMLObject(new Content());                }        }            private class Content implements XMLReadable {            public void readXML(XMLableReader reader) {                if (reader.isChildNode()) {                    if (reader.getTagName().equals("Field")) {                        Field field = new Field();                        reader.readXMLObject(field);                        // 获得name对应的value值                        if (Name[0].equals(field.name)) {                            Value[0] = field.value;                        } else if (Name[1].equals(field.name)) {                            Value[1] = field.value;                        } else if (Name[2].equals(field.name)) {                            Value[2] = field.value;                        }                    }                }            }        }            // 定义每个field的结构        private class Field implements XMLReadable {            private String name;            private String type;            private String value;                public void readXML(XMLableReader reader) {                if (reader.isChildNode()) {                    String tagName = reader.getTagName();                    if (tagName.equals("Name")) {                        this.name = reader.getElementValue();                    } else if (tagName.equals("Type")) {                        this.type = reader.getElementValue();                    } else if (tagName.equals("Value")) {                        this.value = reader.getElementValue();                    }                }            }        }    }

定义程序数据集

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

package com.fr.data;        import java.io.InputStream;     import java.io.StringBufferInputStream;  import java.sql.Connection;    import java.sql.DriverManager;    import java.sql.ResultSet;    import java.sql.Statement;    import java.util.ArrayList;      import 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[columnIndex];        }            public int getRowCount() {            init();            return valueList.size();        }            public Object getValueAt(int rowIndex, int columnIndex) {            init();            return ((Object[]) valueList.get(rowIndex))[columnIndex];        }            private void init() {            // 确保只被执行一次            if (valueList != null) {                return;            }            valueList = new ArrayList();            String sql = "select * from xmltest";            String[] name = { "MemoryFreeSize", "MemoryTotalSize", "MemoryUsage" };            Connection conn = this.getConncetion();            try {                Statement stmt = conn.createStatement();                ResultSet rs = stmt.executeQuery(sql);                // 用对象保存数据                Object[] objArray = null;                while (rs.next()) {                    objArray = new Object[5];                    String[] xmldata = null;                    objArray[0] = rs.getObject(1);                    objArray[1] = rs.getObject(2);                    InputStream in = new StringBufferInputStream(""                            + rs.getObject(3).toString() + "");                    GetXmlDate getxmldata = new GetXmlDate();                    // 对xml流进行解析,返回的为name对应的value值数组                    xmldata = getxmldata.readerXMLSource(in, name);                    // 将解析后的值存于最终结果ArrayList中                    objArray[2] = xmldata[0];                    objArray[3] = xmldata[1];                    objArray[4] = xmldata[2];                    valueList.add(objArray);                }                // 释放数据源                rs.close();                stmt.close();                conn.close();            } catch (Exception e) {                e.printStackTrace();            }        }            public Connection getConncetion() {            String driverName = "oracle.jdbc.driver.OracleDriver";            String url = "jdbc:oracle:thin:@192.168.100.169:1521:orcl10g";            String username = "temp";            String password = "temp123";            Connection con = null;                try {                Class.forName(driverName);                con = DriverManager.getConnection(url, username, password);            } catch (Exception e) {                e.printStackTrace();                return null;            }            return con;            }            // 释放一些资源,因为可能会有重复调用,所以需释放valueList,将上次查询的结果释放掉        public void release() throws Exception {            super.release();            this.valueList = null;        }    }

上述代码中的数据库连接改动自己存档xmltest表的数据库

编译程序数据源

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

配置程序数据源

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

使用程序数据源

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

BS访问报表,效果如下:

以上就是FineReport中怎么解析数据库内XML文件,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

数据 报表 程序 数据库 数据源 字段 文件 查询 代码 数组 格式 结果 制作 编译 方法 更多 来源 知识 篇文章 类型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云信互联网科技有限公司 深圳恒合互联网络科技有限公司 互联网扶贫科技 奇酷互联网科技 人人互联网科技是培训 开启互联网科技时代小说 互联网科技博主是什么意思 佳云科技和互联网广告 中国互联网十大科技股排名 乌鲁木齐新华智原互联网科技学校 深圳市罗太互联网科技有限公司 沐思想互联网科技有限公司 南通创西澳互联网科技有限公司 上海创道互联网络科技有限公司 上海互联网科技公司ppt 云南互联网科技学费 安徽九吞吴互联网科技有限公司 网互联网络科技 株洲百竞科技的互联网营销顾问 小牛互联网科技有限公司地址 蓝思科技飞鸽互联网 互联网科技工作委员会毛军 科技制造互联网公司 新浪科技互联网 互联网科技有哪些公司 中国互联网公司排名锤子科技 本届互联网大会上的黑科技 北京天晋互联网科技有限公司 求路客互联网科技电话 互联网科技创业计划的风险分析
0