将关系系数据库转化为xml文件的通用程序

xml|程序|数据|数据库

 总是在网络上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文件,我转换的规则为将记录的关键字作为元素的属性,其它作为了结点。当然,你也可以以自己的规则将数据库中的任何字段设置为属性或元素。所有元素及属性的名称可以自定义,表中的内容为:

 学号     姓名      学校         系别       家庭住址 
20033274   邪    华中师范大学 信息管理系  湖北省监利县龚场镇 
20043225  阿维   中南民族大学    经济系   湖北省监利县周老咀镇 

假设关键字段为“学号”,则可将此表转换为一个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文件,文件内容为:

<?xml version="1.0" encoding="GB2312"?>

<学生基本信息>

<学生 学生学号="20033274">
<学生的姓名>邪</学生的姓名>
<所在学校>华中师范大学</所在学校>
<所在系>信息管理</所在系>
<住址>湖北省监利县龚场镇</住址>
</学生>

<学生 学生学号="20043225">
<学生的姓名>阿维</学生的姓名>
<所在学校>中南民族大学</所在学校>
<所在系>经济系</所在系>
<住址>湖北省监利县周老咀镇</住址>
</学生>

</学生基本信息>

当然,如果数据表中有多个关键字,也可以在程序中指定多个属性。
至此,一个xml文件就产生了。当然,为求程序简便,关于xml文件中的命名空间、CDATA都没有作处理。希望可以起到抛砖引玉的作用。
程序流程及逻辑可以参看类中的注释~。
(-小邪(QQ:156411203,欢迎交流)-2006.7.21)。
最后补充一点,你并不需要为每一个查询结果集中的字段都指派相应的元素或属性名,而只需根据你自己的需要,为你想要储存到xml文件中的那些字段指派名称就可以了,最后,别忘记了调用designOver()函数,告诉程序表示已经指派完毕了!'

注:本文转自http://bbs.xml.org.cn/dispbbs.asp?boardID=17&replyID=75002&ID=41933&skin=1

时间: 2024-08-19 22:42:37

将关系系数据库转化为xml文件的通用程序的相关文章

xml-java查询数据库数据转为XML文件实体属性多时的问题

问题描述 java查询数据库数据转为XML文件实体属性多时的问题 现在是查出数据库数据是list集合,通过遍历list获取Custinfo,如果实体中有很多属性那么就要写很多次getxxx()感觉这样繁琐很浪费时间,有什么方法不通过getXxx()可以把Custinfo属性中对应的数据库的数据循环加到xml文件中,目的是想减少实体中有很多属性时写getXxx(),这个想法是不是行不通? 解决方案 为什么要转为xml文件,,别人都是转为json,, 解决方案二: 你想想框架是怎么根据你的Bean对

ASP中查询数据库记录写入XML文件示例

xml|示例|数据|数据库 把下面代码保存为Asp_XML.asp运行即可: <% 'By Dicky 2005-03-22 21:52:18 AM QQ:25941 E-mail:AppleBBS@GMail.Com Const IsSql = 1    '定义数据库类型为SQL Server Call OpenConn(Conn) '打开数据库连接 Dim Rs,Sql Set Rs = Server.CreateObject("ADODB.RecordSet") Sql =

Jdom读取数据库并生成xml文件示例

  1.WriteXml.java:  代码如下   package cn.gov.csrc.xml; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import jav

asp access数据库并生成XML文件范例_应用技巧

首先来看,ASP读取ACCESS数据库. 复制代码 代码如下: <% @language="VBScript" @codepage="65001"%> <% '开启显式变量声明 Option Explicit '设置输出类型 Response.contentType="text/xml" '定义三个变量,conn(Connection对象).connstr(ConnectionString).sql(一个SQL语句) dim c

asp.net 数据库数据转换成xml文件方法

首先使用sqlconnection打开数据库教程链接,使用sqlcommand打开Employees数据表,并将数据保存到DataSet对象中.然后以DataSet对象为数据源,建立一个XmlDocument对象,并使用XmlDocuemnt对象的Save方法,将数据保存到指定的XML文件中 <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OleDb"

asp access数据库并生成XML文件范例

首先来看,ASP读取ACCESS数据库. 复制代码 代码如下: <% @language="VBScript" @codepage="65001"%> <% '开启显式变量声明 Option Explicit '设置输出类型 Response.contentType="text/xml" '定义三个变量,conn(Connection对象).connstr(ConnectionString).sql(一个SQL语句) dim c

将具有特殊格式的文件转化为xml文件

xml 假如我们现在有这样的一个文件food.tab内容如下:Room_Number  Breakfast   Lunch      Dinner290                    Bagel       Pizza      Salmon301                   Orange      Pizza      Chicken ala King349                   Sweet Roll  Salad      Tofu and Vegetables

将ado方便的转化为XML文件(adPersistXML)

ado|xml <!-- #include file="adovbs.inc" --><%' 删除已经存在的文件Dim objFSOSet objFSO = Server.CreateObject("Scripting.FileSystemObject")If objFSO.FileExists(Server.MapPath("db_xml.xml")) Then    objFSO.DeleteFile Server.MapP

将ado方便的转化为XML文件

<!-- #include file="adovbs.inc" --><%' 删除已经存在的文件Dim objFSOSet objFSO = Server.CreateObject("Scripting.FileSystemObject")If objFSO.FileExists(Server.MapPath("db_xml.xml")) Then    objFSO.DeleteFile Server.MapPath(&quo