我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

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

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

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>

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

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

对于这样的情况要如何来实现呢?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("<demo>"    
                        + rs.getObject(3).toString() + "</demo>");    
                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,如下:

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

BS访问报表,效果如下:

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中怎么解析XML文件

本篇文章给大家分享的是有关Android中怎么解析XML文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。XMLXML(eXtensible Markup Language)中
2023-05-30

怎么使用dom4j解析xml文件

怎么使用dom4j解析xml文件?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。DOM4J解析特征:1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示
2023-05-31

php中怎么利用expat方式解析xml文件

这篇文章将为大家详细讲解有关php中怎么利用expat方式解析xml文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。test.xml:
2023-06-04

利用java怎么对xml文件进行解析

利用java怎么对xml文件进行解析?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、【基础知识——扫盲】sax、dom是两种对xml文档进行解析的方法(没有具体实现,只是接口
2023-05-31

Android中怎么使用pull方式解析xml格式文件

这篇文章将为大家详细讲解有关Android中怎么使用pull方式解析xml格式文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体如下:
2023-05-30

Java怎么解析html中的内容并存到数据库

这篇文章主要讲解了“Java怎么解析html中的内容并存到数据库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么解析html中的内容并存到数据库”吧!准备工作我选用的是使用jsou
2023-07-05

PHP中怎么使用XMLReader解析XML文档

PHP中怎么使用XMLReader解析XML文档,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。PHP XMLReader的代码示例如下:< ?PHP header("Cont
2023-06-17

java怎么解析csv文件内容

在Java中解析CSV文件内容通常使用第三方库,比如Apache Commons CSV或OpenCSV。以下是使用Apache Commons CSV库解析CSV文件内容的示例代码:import org.apache.commons.c
java怎么解析csv文件内容
2024-03-14

mysql数据库怎么导入数据库文件

如何将数据库文件导入 mysql 数据库?连接 mysql 服务器。创建要导入文件的数据库。使用命令:mysql database_name 如何将数据库文件导入 MySQL 数据库将数据库文件导入 MySQL 数据库是一个常见的任务,
mysql数据库怎么导入数据库文件
2024-08-05

怎么导入mysql数据库文件 mysql数据库怎么导入sql文件

导入 sql 文件到 mysql 数据库的方法:使用 mysql 客户端执行 source 命令,后跟文件路径。使用 mysql workbench 或 phpmyadmin 等工具,导航到目标数据库并通过“导入”选项导入文件。如何将 SQ
怎么导入mysql数据库文件 mysql数据库怎么导入sql文件
2024-08-13

怎么在pdb数据库中下载文件

你可以使用以下步骤在PDB数据库中下载文件:1. 打开PDB数据库的网站(https://www.rcsb.org/)。2. 在搜索栏中输入你感兴趣的蛋白质或者结构的PDB ID。3. 点击搜索按钮,找到对应的结果。4. 点击该结果的PDB
2023-08-30

编程热搜

目录