xml吧 关注:1,837贴子:5,212
  • 24回复贴,共1

[精]用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
                   *  循环到元素集合中取元素名称,之后从查询结果集中取得数据,创建结点
                   */
                   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()函数,告诉程序表示已经指派完毕了!^_^



    回复
    举报|3楼2006-09-30 09:32
      顶,很实


      回复
      举报|4楼2006-09-30 22:38
        强烈要求吧主再加精,确实很实用,大家要仔细的看啊,一定用的上的~


        回复
        举报|5楼2006-12-28 22:45


          回复
          举报|6楼2007-04-07 00:03
            辛苦


            回复
            举报|7楼2007-04-09 23:01
              SQLExecute conn=new SQLExecute() 我的为什么这个有错误 不能解析


              回复
              举报|8楼2007-12-19 13:38
                操,不赖,顶


                回复
                举报|9楼2008-06-03 19:44
                  好!虽没看完也顶个,日后肯定能用上啊


                  回复
                  举报|10楼2008-07-31 11:20
                    楼主写的很好,有没有把它还原的程序呢??


                    有没有测试过的?
                    虽然楼主已经测试过了。。


                    回复
                    举报|12楼2008-12-17 23:25
                      写得还可以,大家下载下来,运行通过没有??


                      测试通过。需要自己增加一些类库


                      收起回复
                      举报|14楼2009-01-05 22:51
                        SQLExecute conn=new SQLExecute() 有问题啊,怎么解决啊,拜托解释一下


                        我再顶


                        回复
                        举报|16楼2009-05-21 09:36
                          我顶


                          回复
                          举报|17楼2009-08-12 00:58
                            <?xml version="1.0" encoding="GB2312"?> 这一句是怎么写入的?
                            高手请指点阿,谢谢


                            回复
                            举报|18楼2010-01-13 17:02
                              如果我想在最开始的位置<学生基本信息> 中加入一些信息,比如<学生基本信息 年级=“2004级”>该怎么加入?高手指教啊。


                              回复
                              举报|19楼2010-01-13 17:20
                                回复:15楼
                                自己建个数据库连接
                                public static Connection con;
                                     public static Statement sta;
                                     public static ResultSet result;
                                      public static void main(String[] args) throws Exception
                                      {
                                              String forname="oracle.jdbc.driver.OracleDriver";
                                             String url="jdbc:oracle:thin:@localhost:1521:db1";
                                             String user="user";
                                             String password="test";
                                            
                                             try
                                             {
                                               Class.forName(forname).newInstance();
                                               con =DriverManager.getConnection(url,user,password);
                                             }
                                            catch(Exception e)
                                            {
                                             e.printStackTrace();
                                            }
                                     
                                            try {
                                                 sta=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                                             } catch (SQLException e) {
                                                 // TODO Auto-generated catch block
                                                 e.printStackTrace();
                                             }//����������Ҫ��һ��ȷ��
                                             String sql="SELECT TERM,HOT_INDEX FROM D_TABLE   Order By hot_index Desc";
                                             try {
                                                 result=sta.executeQuery(sql);
                                             } catch (SQLException e) {
                                                 // TODO Auto-generated catch block
                                                 e.printStackTrace();
                                             }
                                       //ResultSet rs=((Object) con).sqlQuery("select * from CCNUstudents");
                                       CreateXmlFile create = new CreateXmlFile(result,"d:/demo.xml");
                                             create.setElementName("词汇",1);
                                       create.setElementName("热度",2);
                                       create.setElementName("所在系",4);
                                       create.setElementName("住址",5);
                                       create.designOver();
                                      }

                                }


                                收起回复
                                举报|20楼2010-01-13 22:02
                                  回复:20楼
                                  您好,运行时,报以下错误,可否指点一下?
                                  java.lang.ClassCastException: org.apache.xerces.dom.DocumentImpl cannot be cast to org.apache.crimson.tree.XmlDocument


                                  回复
                                  举报|21楼2010-06-02 14:20
                                    我也遇到这个问题有什么解决的办法吗


                                    CreateXmlFile create = new CreateXmlFile(rs,"demo.xml"); 这个CreateXmlFile()怎么写呀?谢谢


                                    小伙伴们在哪里~