FineReport中如何解析数据库中的XML文件
数据库表中,字段XML以xml格式存储数据在表xmltest中。那么在使用这张表进行报表制作时,需要读取xml字段中存储的值作为报表数据源。
每条XML记录的数据格式如下:
<字段><名称>MemoryTotalSize名称><类型>int类型><值>2047值>字段> p>
<字段> <名称> MemoryTotalSize 名称> <类型> Int 类型><值>2048值>字段> <字段>
<字段><名称>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文件。小编相信,有些知识点在我们日常工作中可能会见到。或使用过。希望您能从本文中了解更多信息。了解更多详情,请支付关注行业信息渠道。
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > FineReport中如何解析数据库中的XML文件