新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> Oracle, SQL Server与XML,XML在数据挖掘中的应用, PMML.
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 XML 与 数据库 』 → [原创]将关系系数据库转化为xml文件的通用程序 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 63993 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [原创]将关系系数据库转化为xml文件的通用程序 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     forgetall 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:57
      门派:XML.ORG.CN
      注册:2007/1/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给forgetall发送一个短消息 把forgetall加入好友 查看forgetall的个人资料 搜索forgetall在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看forgetall的博客楼主
    发贴心情 [原创]将关系系数据库转化为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()函数,告诉程序表示已经指派完毕了!^_^


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/4 13:51:00
     
     caral 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:3
      积分:70
      门派:XML.ORG.CN
      注册:2004/11/1

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给caral发送一个短消息 把caral加入好友 查看caral的个人资料 搜索caral在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看caral的博客2
    发贴心情 
    支持一下!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/2/2 12:29:00
     
     niweiliang 帅哥哟,离线,有人找我吗?
      
      
      等级:大四(GRE考了1500分!)
      文章:242
      积分:1017
      门派:XML.ORG.CN
      注册:2007/1/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给niweiliang发送一个短消息 把niweiliang加入好友 查看niweiliang的个人资料 搜索niweiliang在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看niweiliang的博客3
    发贴心情 
    谢谢
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/13 10:38:00
     
     jingle_even 美女呀,离线,快来找我吧!
      
      
      等级:大一(高数修炼中)
      文章:21
      积分:137
      门派:XML.ORG.CN
      注册:2006/12/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给jingle_even发送一个短消息 把jingle_even加入好友 查看jingle_even的个人资料 搜索jingle_even在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看jingle_even的博客4
    发贴心情 
    顶一下!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/19 16:50:00
     
     xxhouman 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:12
      积分:102
      门派:XML.ORG.CN
      注册:2007/3/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给xxhouman发送一个短消息 把xxhouman加入好友 查看xxhouman的个人资料 搜索xxhouman在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看xxhouman的博客5
    发贴心情 
    顶!!!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/25 0:04:00
     
     hizhfei 帅哥哟,离线,有人找我吗?巨蟹座1983-6-23
      
      
      等级:大一(高数修炼中)
      文章:10
      积分:103
      门派:XML.ORG.CN
      注册:2007/1/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hizhfei发送一个短消息 把hizhfei加入好友 查看hizhfei的个人资料 搜索hizhfei在『 XML 与 数据库 』的所有贴子 点击这里发送电邮给hizhfei 引用回复这个贴子 回复这个贴子 查看hizhfei的博客6
    发贴心情 
    学习中……

    ----------------------------------------------
    帖子浏览中……

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/25 18:53:00
     
     guiguizhu 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:73
      门派:XML.ORG.CN
      注册:2007/3/27

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guiguizhu发送一个短消息 把guiguizhu加入好友 查看guiguizhu的个人资料 搜索guiguizhu在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guiguizhu的博客7
    发贴心情 
    本人刚刚接触XML
    想问下,在异构数据库的数据迁移中使用XML作为转换中介有什么好处呢??
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/27 11:58:00
     
     minmin0876 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:8
      积分:91
      门派:XML.ORG.CN
      注册:2007/1/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给minmin0876发送一个短消息 把minmin0876加入好友 查看minmin0876的个人资料 搜索minmin0876在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看minmin0876的博客8
    发贴心情 
    不错啊,呵呵
    谢谢了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/8 19:50:00
     
     xml-linguist 帅哥哟,离线,有人找我吗?
      
      
      等级:大三暑假(参加全国数模竞赛拿了一等奖)
      文章:121
      积分:869
      门派:XML.ORG.CN
      注册:2007/3/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给xml-linguist发送一个短消息 把xml-linguist加入好友 查看xml-linguist的个人资料 搜索xml-linguist在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看xml-linguist的博客9
    发贴心情 
    令我神往。
    但本人还是门外汉,只有想法,没有能力。

    ----------------------------------------------
    有些事,我只需要知道是否可以做,我不一定非得学会怎么做。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/10 16:38:00
     
     wangshucai 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:7
      积分:83
      门派:XML.ORG.CN
      注册:2007/4/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wangshucai发送一个短消息 把wangshucai加入好友 查看wangshucai的个人资料 搜索wangshucai在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wangshucai的博客10
    发贴心情 
    太感谢了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/24 11:32:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML 与 数据库 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/5 7:17:10

    本主题贴数25,分页: [1] [2] [3]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    142.578ms