FineReport中怎么解析数据库内XML文件
本篇文章给大家分享的是有关FineReport中怎么解析数据库内XML文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
在数据库表中,其中字段XML所存的为xml格式数据在表xmltest中。那么在使用该表进行报表制作时,需要将存于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的数据来源可以是任何类型的数据,因此FineReport是通过AbstractTableData抽象类,也就可以用自定义类型的程序数据集,数据来源是通过把xml格式数据转入ArrayList中。
数据集初始化方法init()
连接目标数据库后,执行sql查询语句,将xmltest表数据全部查询出来,对于ID、NAME字段的值将直接存于新的结果集ArrayList中,对于xml字段通过GetXmlDate类对其进行解析后再转入ArrayList中。
GetXmlDate类代码如下:
packagecom.fr.data;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.Reader;importjava.util.logging.Level;importcom.fr.base.FRContext;importcom.fr.stable.xml.XMLReadable;importcom.fr.stable.xml.XMLableReader;publicclassGetXmlDate{//定义返回值数组privateString[]Value=newString[3];//定义查询的name值privateString[]Name=null;protectedString[]readerXMLSource(InputStreamin,String[]name)throwsException{Name=name;InputStreamReaderreader=newInputStreamReader(in,"utf-8");readXMLSource(reader);returnValue;}protectedvoidreadXMLSource(Readerreader)throwsException{XMLableReaderxmlReader=XMLableReader.createXMLableReader(reader);if(xmlReader!=null){xmlReader.readXMLObject(newContent());}}privateclassContentimplementsXMLReadable{publicvoidreadXML(XMLableReaderreader){if(reader.isChildNode()){if(reader.getTagName().equals("Field")){Fieldfield=newField();reader.readXMLObject(field);//获得name对应的value值if(Name[0].equals(field.name)){Value[0]=field.value;}elseif(Name[1].equals(field.name)){Value[1]=field.value;}elseif(Name[2].equals(field.name)){Value[2]=field.value;}}}}}//定义每个field的结构privateclassFieldimplementsXMLReadable{privateStringname;privateStringtype;privateStringvalue;publicvoidreadXML(XMLableReaderreader){if(reader.isChildNode()){StringtagName=reader.getTagName();if(tagName.equals("Name")){this.name=reader.getElementValue();}elseif(tagName.equals("Type")){this.type=reader.getElementValue();}elseif(tagName.equals("Value")){this.value=reader.getElementValue();}}}}}
定义程序数据集
定义类XMLRead.java,继承AbstractTableData接口,实现getColumnCount、getColumnName、getRowCount、getValueAt四个方法;
XMLRead.java类代码如下:
packagecom.fr.data;importjava.io.InputStream;importjava.io.StringBufferInputStream;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;importjava.util.ArrayList;importcom.fr.data.AbstractTableData;publicclassXMLReadextendsAbstractTableData{//列名数组,保存程序数据集所有列名privateString[]columnNames={"id","name","MemoryFreeSize","MemoryTotalSize","MemoryUsage"};//保存表数据privateArrayListvalueList=null;publicintgetColumnCount(){return5;}publicStringgetColumnName(intcolumnIndex){returncolumnNames[columnIndex];}publicintgetRowCount(){init();returnvalueList.size();}publicObjectgetValueAt(introwIndex,intcolumnIndex){init();return((Object[])valueList.get(rowIndex))[columnIndex];}privatevoidinit(){//确保只被执行一次if(valueList!=null){return;}valueList=newArrayList();Stringsql="select*fromxmltest";String[]name={"MemoryFreeSize","MemoryTotalSize","MemoryUsage"};Connectionconn=this.getConncetion();try{Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sql);//用对象保存数据Object[]objArray=null;while(rs.next()){objArray=newObject[5];String[]xmldata=null;objArray[0]=rs.getObject(1);objArray[1]=rs.getObject(2);InputStreamin=newStringBufferInputStream("<demo>"+rs.getObject(3).toString()+"</demo>");GetXmlDategetxmldata=newGetXmlDate();//对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(Exceptione){e.printStackTrace();}}publicConnectiongetConncetion(){StringdriverName="oracle.jdbc.driver.OracleDriver";Stringurl="jdbc:oracle:thin:@192.168.100.169:1521:orcl10g";Stringusername="temp";Stringpassword="temp123";Connectioncon=null;try{Class.forName(driverName);con=DriverManager.getConnection(url,username,password);}catch(Exceptione){e.printStackTrace();returnnull;}returncon;}//释放一些资源,因为可能会有重复调用,所以需释放valueList,将上次查询的结果释放掉publicvoidrelease()throwsException{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文件,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。