用java语言将数据库中的数据表转换为xml文件的通用程序(细化)
转自:https://www.cnblogs.com/wudage/p/7650685.html
总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要频繁从数据库中提取数据转化成xml文件会有帮助。
最近公司项目中有一件事就是从数据库表中读出数据,然后转换成xml文件供客户端下载,由于数据库中表太多,不可能为单独的每个表都写一个转换程序。于是,经过分析,写了一个通用的用ResultSet对象转换成xml文件的程序。这样,只需把查询结果集(ResultSet对象)和要生成的xml文件的路径传入,然后自己指派属性名称、元素名称并与对应的查询结果集中的字段相对应,最后调用designOver()函数,就可以生成所期望的xml文件了。最后,给出了一个示例程序。
我是用dom解析的,用纯java语言编写,程序包括5个类:CreateXmlFile.java、Disposal.java、SaveAttrName.java、SaveEleName.java、WriteXmlFile.java
真正与用户交互的只有CreateXmlFile.java,如果不想了解程序逻辑,可不用管其他类。代码讲解及示例如下:
文件 CreateXmlFile.java 内容:
package currencycreatexml;
import java.sql.*;
public class CreateXmlFile
{
private ResultSet rs; //从下面的程序可以看出,此字段可省略,懒得改了,呵呵
private String url; //从下面的程序可以看出,此字段可省略,懒得改了,呵呵
private Disposal disposal; //自定义的用来收集和处理数据的类
private String root; //xml文件的根元素名称
private String rootchild; //根结点的子结点的元素名称
/**
* @param rs : 创建xml文件所需的查询结果集
* @param url : 指定xml文件的生成路径(包括xml文件的文件名)
*/
public CreateXmlFile(ResultSet rs,String url)
{
this.rs=rs;
this.url=url;
disposal=new Disposal();
disposal.setResultSet(this.rs,this.url);
}
//设定xml文件的根元素名称
public void setRootElementName(String root,String rootchild)
{
this.root=root;
this.rootchild=rootchild;
disposal.setRootName(this.root,this.rootchild);
}
//设置属性的名字和索引位置,位置从1开始
/**
* @param namestring 指定属性的名称
* @param index 指定此属性的值在查询结果集中第几个字段(字段从1开始索引)
*/
public void setAttributeName(String namestring,int index)
{
disposal.collectData(namestring,index,"attribute");
}
//设置元素的名字和索引位置,位置从1开始
/**
* @param namestring 指定元素的名称
* @param index 指定此元素的值在查询结果集中的第几个字段(字段从1开始索引)
*/
public void setElementName(String namestring,int index)
{
disposal.collectData(namestring,index,"element");
}
/**
* 调用此方法则立即开始创建xml文件,在属性与元素都已指派完毕后调用此方法
*/
public void designOver()
{
disposal.startWrite();
}
}
文件 Disposal.java 内容:
package currencycreatexml;
import java.util.*;
import java.sql.*;
class Disposal
{
private ResultSet rs;
private String url;
private ArrayList attrilist=new ArrayList(); //用来存储属性名和字段索引的集合类
private ArrayList elelist=new ArrayList(); //用来存储元素名和字段索引的集合类
private String root;
private String rootchild;
public void setResultSet(ResultSet rs,String url)
{
this.rs=rs;
this.url=url;
}
public void setRootName(String root,String rootchild)
{
this.root=root;
this.rootchild=rootchild;
}
@SuppressWarnings("unchecked")
public void collectData(String namestring,int index,String type )
{
if(type.equals("attribute"))
attrilist.add(new SaveAttrName(namestring,index));
else
elelist.add(new SaveEleName(namestring,index));
//System.out.println("else");
//System.exit(0);
}
public void startWrite()
{
new WriteXmlFile(attrilist,elelist,rs,url).create(root,rootchild);
}
}
文件 SaveAttrName.java 内容:
package currencycreatexml;
class SaveAttrName
{
private String attributename;
private int index;
public SaveAttrName(String attributename,int index)
{
this.attributename=attributename;
this.index=index;
}
public String getAttributeName()
{
return attributename;
}
public int getIndex()
{
return index;
}
}
文件 SaveEleName.java 内容:
package currencycreatexml;
class SaveEleName
{
private String elementname;
private int index;
public SaveEleName(String elementname,int index)
{
this.elementname=elementname;
this.index=index;
}
public String getElementName()
{
return elementname;
}
public int getIndex()
{
return index;
}
}
文件 WriteXmlFile.java 内容:
package currencycreatexml;
import java.io.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import javax.xml.parsers.*;
import org.w3c.dom.*; //使用dom解析
import org.apache.crimson.tree.*; //写xml文件需要用到的jar包
class WriteXmlFile
{
private ResultSet rs;
private String url;
private ArrayList attrilist;
private ArrayList elelist;
public WriteXmlFile(ArrayList attrilist,ArrayList elelist,ResultSet rs,String url)
{
this.attrilist=attrilist;
this.elelist=elelist;
this.rs=rs;
this.url=url;
}
/**
* @param root : xml文件的根元素名
*/
public void create(String root,String rootchild)
{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
Document doc=null;
try
{
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.newDocument();
}
catch (ParserConfigurationException e)
{
e.printStackTrace();
}
Element rootelement=doc.createElement(root);
doc.appendChild(rootelement);
Iterator attri=attrilist.iterator();
Iterator ele=elelist.iterator();
//System.out.println("iterator");
try
{
while(rs.next())
{
Element rootchildelement=doc.createElement(rootchild);
//System.out.println("while");
while(attri.hasNext())
{
/**
* 循环到属性集合中取元素名称,之后从查询结果集中取得数据,创建元素属性
*/
SaveAttrName temp=(SaveAttrName)attri.next();
rootchildelement.setAttribute(temp.getAttributeName(),rs.getString(temp.getIndex()).trim());
}
rootelement.appendChild(rootchildelement);
while(ele.hasNext())
{
/**
* 循环到元素集合中取元素名称,之后从查询结果集中取得数据,创建结点
*/
SaveEleName temp=(SaveEleName)ele.next();
Element tempelement=doc.createElement(temp.getElementName());
Text temptextelement=doc.createTextNode(rs.getString(temp.getIndex()).trim());
tempelement.appendChild(temptextelement);
rootchildelement.appendChild(tempelement);
}
attri=attrilist.iterator(); //重复循环到集合中取值,下同
ele=elelist.iterator();
}
}
catch (Exception e)
{
e.printStackTrace();
}
writeXml(doc);
}
private void writeXml(Document doc)
{
try
{
FileOutputStream outStream = new FileOutputStream(url);
OutputStreamWriter outWriter = new OutputStreamWriter(outStream);
((XmlDocument)doc).write(outWriter, "GB2312");
outWriter.close();
outStream.close();
System.out.print("\nWrite xmlfile successful!\n");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
讲解:
假设数据库中有一个表,表名为“CCNUstudents”,
表中有几条记录,现将它转换为xml文件,我转换的规则为将记录的关键字作为元素的属性,其它作为了结点。当然,你也可以以自己的规则将数据库中的任何字段设置为属性或元素。所有元素及属性的名称可以自定义,表中的内容为:
[color=#333399] 学号 姓名 学校 系别 家庭住址
20033274 邪 华中师范大学 信息管理系 湖北省监利县龚场镇
20043225 阿维 中南民族大学 经济系 湖北省监利县周老咀镇[/color]
假设关键字段为“学号”,则可将此表转换为一个xml文件:
示例代码如下:
文件 test.java 中测试函数的内容:
public static void main(String[] args) throws Exception
{
SQLExecute conn=new SQLExecute();
ResultSet rs=conn.sqlQuery("select * from CCNUstudents");
CreateXmlFile create = new CreateXmlFile(rs,"demo.xml");
create.setRootElementName("学生基本信息","学生");
create.setAttributeName("学生学号",1);
create.setElementName("学生的姓名",2);
create.setElementName("所在学校",3);
create.setElementName("所在系",4);
create.setElementName("住址",5);
create.designOver();
}
函数setAttributeName(String,int)及setElementName(String,int)中的String用来指定元素名或是属性名,int型数字用来关联此元素或属性的值是从表中的第几个字段取出来的。程序运行结果后,就会在当前目录下生成一个名为“demo.xml”的xml文件,文件内容为:
[color=#990000]<?xml version="1.0" encoding="GB2312"?>
<学生基本信息>
<学生 学生学号="20033274">
<学生的姓名>邪</学生的姓名>
<所在学校>华中师范大学</所在学校>
<所在系>信息管理</所在系>
<住址>湖北省监利县龚场镇</住址>
</学生>
<学生 学生学号="20043225">
<学生的姓名>阿维</学生的姓名>
<所在学校>中南民族大学</所在学校>
<所在系>经济系</所在系>
<住址>湖北省监利县周老咀镇</住址>
</学生>
</学生基本信息>[/color]
当然,如果数据表中有多个关键字,也可以在程序中指定多个属性。
至此,一个xml文件就产生了。当然,为求程序简便,关于xml文件中的命名空间、CDATA都没有作处理。希望可以起到抛砖引玉的作用。
程序流程及逻辑可以参看类中的注释~。
(-小邪(QQ:156411203,欢迎交流)-2006.7.21)。
最后补充一点,你并不需要为每一个查询结果集中的字段都指派相应的元素或属性名,而只需根据你自己的需要,为你想要储存到xml文件中的那些字段指派名称就可以了,最后,别忘记了调用designOver()函数,告诉程序表示已经指派完毕了!^_^
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
细化
http://www.docjar.com/jar_detail/org.apache.crimson.jar.html 需要引入jar

用java语言将数据库中的数据表转换为xml文件的通用程序(细化)的更多相关文章
- 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成
孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天经过反复折腾,最终基本上算 ...
- 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数
孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天打算完成的是通用的(至少目 ...
- 对SharePoint 2007数据库中一些数据表的使用
转:http://blog.csdn.net/ma_jiang/article/details/6553392 在工作中接触了一些SharePoint的数据库中的一些表.在此做个总结. 一位高手告诉我 ...
- 用C# ASP.net将数据库中的数据表导出到Excel中
需要用到组件GridView和一个button即可. 给GridView添加一个数据源, 选择你想要的数据库中的表的字段,添加成功后GridView中就显示数据. 再添加一个button,双击控件添加 ...
- 直接把数据库中的数据保存在CSV文件中
今天突然去聊就来写一个小小的demo喽,嘿嘿 public partial class Form1 : Form { public Form1() { InitializeComponent(); } ...
- 通过纯Java代码从excle中读取数据(为.xlsx文件)
参考链接: 程序代码: package demo; import java.io.File; import java.io.IOException; import java.io.InputStrea ...
- Java项目往数据库中插入数据,出现中文乱码
项目环境: JSP+Servlet+Mysql数据库 需要检查的地方: 1. java项目整体的编码格式为utf-8.并且将数据传递给数据库之前,数据是否依旧是正常的(可以通过打断点的方式一步步跟踪查 ...
- java 将MySql数据库中的数据(某一列)取出放入数组中 转
转:http://blog.csdn.net/ewili/article/details/8605638 假设mysql中test数据库中有个表式score,有数据,我只取第一列的数据出来: publ ...
- MySQL查询数据库中所有数据表的数据条数
select table_name,table_rows from information_schema.tables where TABLE_SCHEMA = '数据库名称' order by ta ...
随机推荐
- ASP.NET Core中的Startup
原文:链接 Startup.cs的作用: 配置各服务和HTTP请求管道. Startup类: ASP.NET Core中使用按惯例Startup命名的类Startup.cs: (可选)包括Config ...
- linux系统错误码大全
#define EPERM 1 /* Operation not permitted */ #define ENOENT 2 /* No such file or directory */ #defi ...
- Xamarin图表开发基础教程(13)OxyPlot框架支持的其它图表
Xamarin图表开发基础教程(13)OxyPlot框架支持的其它图表 除了以上提到的图表外,OxyPlot组件还包含了6种类型的其它图表,分别为等高线图.箱线图.饼图.热图.散点图和散点误差图,如图 ...
- CRT 上传下载文件
yum install -y lrzsz 上传 rz -be 下载 sz 文件名
- linux命令(56):环境变量:/etc/profile、/etc/bashrc 、~/.profile、~/.bashrc
添加环境变量:https://www.cnblogs.com/lovychen/p/5583703.html 一.环境变量介绍: 在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变 ...
- IfcRoot
IfcRoot is the most abstract and root class for all entity definitions that roots in the kernel or i ...
- js数组、对象处理
js arry: var arry = []; js object: var obj = {}; obj定义属性: obj.filename=''; obj.id=''; 把 obj 添加到 arry ...
- Kafka高级设计和架构,一文深化理解
主题: 1.kafka是写磁盘还是写内存? 2.kafka究竟是由 consumer 从 broker 那里拉数据,还是由 broker 将数据推到 consumer? 3.如何区分已消费(consu ...
- C++内存管理4-Windows编程中的堆管理(转)
1 引言 在大多数Windows应用程序设计中,都几乎不可避免的要对内存进行操作和管理.在进行大尺寸内存的动态分配时尤其显的重要.本文即主要对内存管理中的堆管理技术进行论述. 堆(Heap)实际是位于 ...
- 文件组 'PRIMARY' 已满 解决办法
修改一个字段类型时,报的这个错. 此时需要增加次要数据文件 次要数据文件 次要数据文件包含除主要数据文件外的所有数据文件.有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件.次要数据文件 ...