用java語言將數據庫中的數據錶轉換爲xml文件的通用程序

    相信這個程序會對大家在平時的工作中需要頻繁從數據庫中提取數據轉化成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();
      }  
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章