用java语言将数据库中的数据表变换为xml文件的通用程序

用java语言将数据库中的数据表转换为xml文件的通用程序
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())
            {
               /**

回复

    2楼
    2006-09-30 09:32

    举报 |

吧友210.42.106.*
               *  循环到元素集合中取元素名称,之后从查询结果集中取得数据,创建结点
               */
               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都没有作处理。希望可以起到抛砖引玉的作用。