转自:https://www.cnblogs.com/wudage/p/7650685.html

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

[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()函数,告诉程序表示已经指派完毕了!^_^

—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

细化

http://www.docjar.com/jar_detail/org.apache.crimson.jar.html 需要引入jar

用java语言将数据库中的数据表转换为xml文件的通用程序(细化)的更多相关文章

  1. 孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成

    孤荷凌寒自学python第四十八天通用同一数据库中复制数据表函数最终完成 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天经过反复折腾,最终基本上算 ...

  2. 孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数

    孤荷凌寒自学python第四十七天通用跨数据库同一数据库中复制数据表函数 (完整学习过程屏幕记录视频地址在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 今天打算完成的是通用的(至少目 ...

  3. 对SharePoint 2007数据库中一些数据表的使用

    转:http://blog.csdn.net/ma_jiang/article/details/6553392 在工作中接触了一些SharePoint的数据库中的一些表.在此做个总结. 一位高手告诉我 ...

  4. 用C# ASP.net将数据库中的数据表导出到Excel中

    需要用到组件GridView和一个button即可. 给GridView添加一个数据源, 选择你想要的数据库中的表的字段,添加成功后GridView中就显示数据. 再添加一个button,双击控件添加 ...

  5. 直接把数据库中的数据保存在CSV文件中

    今天突然去聊就来写一个小小的demo喽,嘿嘿 public partial class Form1 : Form { public Form1() { InitializeComponent(); } ...

  6. 通过纯Java代码从excle中读取数据(为.xlsx文件)

    参考链接: 程序代码: package demo; import java.io.File; import java.io.IOException; import java.io.InputStrea ...

  7. Java项目往数据库中插入数据,出现中文乱码

    项目环境: JSP+Servlet+Mysql数据库 需要检查的地方: 1. java项目整体的编码格式为utf-8.并且将数据传递给数据库之前,数据是否依旧是正常的(可以通过打断点的方式一步步跟踪查 ...

  8. java 将MySql数据库中的数据(某一列)取出放入数组中 转

    转:http://blog.csdn.net/ewili/article/details/8605638 假设mysql中test数据库中有个表式score,有数据,我只取第一列的数据出来: publ ...

  9. MySQL查询数据库中所有数据表的数据条数

    select table_name,table_rows from information_schema.tables where TABLE_SCHEMA = '数据库名称' order by ta ...

随机推荐

  1. Windows下将网络共享目录挂载到指定文件夹

    简述 因为某些原因,设计好的目录结构是不能动的,因此需要将网络共享目录挂载到指定目录下,以便扩容. 在Linux下这完全没有问题,但是Windows下的操作就稍微复杂一点. 1.直接使用net use ...

  2. Gradle 教程: 教你配置全局国内仓库,解决新建项目卡顿,下载构建慢等问题

    想必各位从Maven 转过来的大佬们,对于maven中配置国内仓库的方法还记忆深刻.通过/用户目录下/.m2/settings.xml 局部配置或者修改全局配置.不过没有接触过maven 也不要紧,可 ...

  3. Win10如何开启蓝屏记录?Win10开启蓝屏信息记录的方法

    转载:http://www.xitongzhijia.net/xtjc/20170127/91010.html 蓝屏,是电脑最常见的故障,一般出现蓝屏时都会显示详细的蓝屏错误信息,方便用户排查故障.最 ...

  4. 一份ChatBot开源工程介绍(H5 + WX + KOA)

    vue-mpvue-ChatRobot https://github.com/fanqingsong/vue-mpvue-ChatRobot 前端 : Vue + Mpvue(支持移动端与小程序) ; ...

  5. k8s记录-国内下载k8s组件镜像

    #!/bin/sh ### 版本信息 K8S_VERSION=v1.13.2 ETCD_VERSION=3.2.24 DASHBOARD_VERSION=v1.8.3 FLANNEL_VERSION= ...

  6. OpenStack(三)——allinone云平台的使用方法

    接着OpenStack(二)——使用Kolla部署OpenStack-allinone云平台继续操作. 特别感谢https://www.cnblogs.com/openstackteam/p/5519 ...

  7. Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) 解决办法

    1:我遇到的问题: 在开机运行apt install vim 命令的时候,如下报错: 2:参考博客: 在Ubuntu中,有时候运用sudo  apt-get install 安装软件时,会出现一下的情 ...

  8. Android逆向破解:Android Killer使用

    目录   目录 软件介绍 Android Killer是一款可以对APK进行反编译的工具,它能够对反编译后的Smali文件进行修改,并将修改后的文件进行打包. 软件下载 这里用的是@昨夜星辰2012 ...

  9. 【转】什么是5G?居然有人用漫画把它讲得如此接地气!

    最近一系列层出不穷的新闻,似乎都离不开一个关键词——5G.在各大报道中,都提到5G网络是移动无线技术的下一个重要发展. 任正非之前也在采访中说过: “5G,别人两三年也不会追上我们的.” “5G并不是 ...

  10. svg可视化制作工具

    svg可视化制作工具直接ai里面用钢笔路径画好 然后右键建立复合路径 最后存储为svg即可 这样生成的svg就带path标签了