用java语言将数据库中的数据表转换为xml文件的通用程序
2009-12-04 15:35
381 查看
相信这个程序会对大家在平时的工作中需要频繁从数据库中提取数据转化成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();
}
}
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);
}
}
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;
}
}
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;
}
}
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();
}
}
}
最近公司项目中有一件事就是从数据库表中读出数据,然后转换成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();
}
}
}
相关文章推荐
- 用java语言将数据库中的数据表转换为xml文件的通用程序(转)
- Java实现数据库数据生成XML文件的通用程序
- 将关系系数据库转化为xml文件的通用程序
- 数据库与java程序数据传递过程中日期类型的转换
- C#.NET通用权限管理在DB2数据库上运行的脚本参考 - 通过程序将数据导入到目标数据库中
- 强大的 将XML文件的数据导入到数据库的 程序 只需输入xml文件名即可自动创建
- 将关系系数据库转化为xml文件的通用程序
- 将关系系数据库转化为xml文件的通用程序
- C#.NET通用权限管理在DB2数据库上运行的脚本参考 - 通过程序将数据导入到目标数据库中
- vc2008: 控制台程序将数据写入MySql(数据库信息从配置文件读取)
- 每天一个python小程序 3向Redis数据库中插入数据
- 使用程序把access2000 数据转到MSsql数据库中
- 用ResultSet对象创建XML文件的通用程序
- 使用Linq to xml 动态创建Xml文件(数据来自数据库)
- 从数据库查询出来的数据集合转换成 json 类型
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
- 简单程序所需要的简单 asp.net通用数据库访问类
- php数据库数据转换为js中的json对象
- 向数据库中插入一个DateTime类型的数据到一个Date类型的字段中,需要转换类型。TO_DATE('{0}','YYYY-MM-DD'))
- 数据库之SQL 数据类型转换 使用cast()函数