`
sogotobj
  • 浏览: 617654 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

将关系系数据库转化为xml文件的通用程序

阅读更多

将关系系数据库转化为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内容:
packagecurrencycreatexml;

importjava.sql.*;


publicclassCreateXmlFile
{
privateResultSetrs;//从下面的程序可以看出,此字段可省略,懒得改了,呵呵
privateStringurl;//从下面的程序可以看出,此字段可省略,懒得改了,呵呵
privateDisposaldisposal;//自定义的用来收集和处理数据的类
privateStringroot;//xml文件的根元素名称
privateStringrootchild;//根结点的子结点的元素名称
/**
*@paramrs:创建xml文件所需的查询结果集
*@paramurl:指定xml文件的生成路径(包括xml文件的文件名)
*/
publicCreateXmlFile(ResultSetrs,Stringurl)
{
this.rs=rs;
this.url=url;
disposal=newDisposal();
disposal.setResultSet(this.rs,this.url);
}
//设定xml文件的根元素名称
publicvoidsetRootElementName(Stringroot,Stringrootchild)
{
this.root=root;
this.rootchild=rootchild;
disposal.setRootName(this.root,this.rootchild);
}
//设置属性的名字和索引位置,位置从1开始
/**
*@paramnamestring指定属性的名称
*@paramindex指定此属性的值在查询结果集中第几个字段(字段从1开始索引)
*/
publicvoidsetAttributeName(Stringnamestring,intindex)
{
disposal.collectData(namestring,index,"attribute");
}
//设置元素的名字和索引位置,位置从1开始
/**
*@paramnamestring指定元素的名称
*@paramindex指定此元素的值在查询结果集中的第几个字段(字段从1开始索引)
*/
publicvoidsetElementName(Stringnamestring,intindex)
{
disposal.collectData(namestring,index,"element");
}
/**
*调用此方法则立即开始创建xml文件,在属性与元素都已指派完毕后调用此方法
*/
publicvoiddesignOver()
{
disposal.startWrite();
}
}


文件Disposal.java内容:

packagecurrencycreatexml;

importjava.util.*;
importjava.sql.*;

classDisposal
{
privateResultSetrs;
privateStringurl;
privateArrayListattrilist=newArrayList();//用来存储属性名和字段索引的集合类
privateArrayListelelist=newArrayList();//用来存储元素名和字段索引的集合类
privateStringroot;
privateStringrootchild;
publicvoidsetResultSet(ResultSetrs,Stringurl)
{
this.rs=rs;
this.url=url;
}
publicvoidsetRootName(Stringroot,Stringrootchild)
{
this.root=root;
this.rootchild=rootchild;
}
@SuppressWarnings("unchecked")
publicvoidcollectData(Stringnamestring,intindex,Stringtype)
{
if(type.equals("attribute"))
attrilist.add(newSaveAttrName(namestring,index));
else
elelist.add(newSaveEleName(namestring,index));
//System.out.println("else");
//System.exit(0);
}
publicvoidstartWrite()
{
newWriteXmlFile(attrilist,elelist,rs,url).create(root,rootchild);
}
}


文件SaveAttrName.java内容:

packagecurrencycreatexml;

classSaveAttrName
{
privateStringattributename;
privateintindex;
publicSaveAttrName(Stringattributename,intindex)
{
this.attributename=attributename;
this.index=index;
}
publicStringgetAttributeName()
{
returnattributename;
}
publicintgetIndex()
{
returnindex;
}
}

文件SaveEleName.java内容:

packagecurrencycreatexml;

classSaveEleName
{
privateStringelementname;
privateintindex;
publicSaveEleName(Stringelementname,intindex)
{
this.elementname=elementname;
this.index=index;
}
publicStringgetElementName()
{
returnelementname;
}
publicintgetIndex()
{
returnindex;
}
}

文件WriteXmlFile.java内容:

packagecurrencycreatexml;

importjava.io.*;
importjava.sql.*;
importjava.util.ArrayList;
importjava.util.Iterator;
importjavax.xml.parsers.*;

importorg.w3c.dom.*;//使用dom解析
importorg.apache.crimson.tree.*;//写xml文件需要用到的jar包

classWriteXmlFile
{
privateResultSetrs;
privateStringurl;
privateArrayListattrilist;
privateArrayListelelist;
publicWriteXmlFile(ArrayListattrilist,ArrayListelelist,ResultSetrs,Stringurl)
{
this.attrilist=attrilist;
this.elelist=elelist;
this.rs=rs;
this.url=url;
}
/**
*@paramroot:xml文件的根元素名
*/
publicvoidcreate(Stringroot,Stringrootchild)
{
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
Documentdoc=null;
try
{
DocumentBuilderdb=dbf.newDocumentBuilder();
doc=db.newDocument();
}
catch(ParserConfigurationExceptione)
{
e.printStackTrace();
}
Elementrootelement=doc.createElement(root);
doc.appendChild(rootelement);
Iteratorattri=attrilist.iterator();
Iteratorele=elelist.iterator();
//System.out.println("iterator");
try
{
while(rs.next())
{
Elementrootchildelement=doc.createElement(rootchild);
//System.out.println("while");
while(attri.hasNext())
{
/**
*循环到属性集合中取元素名称,之后从查询结果集中取得数据,创建元素属性
*/
SaveAttrNametemp=(SaveAttrName)attri.next();
rootchildelement.setAttribute(temp.getAttributeName(),rs.getString(temp.getIndex()).trim());
}
rootelement.appendChild(rootchildelement);
while(ele.hasNext())
{
/**
*循环到元素集合中取元素名称,之后从查询结果集中取得数据,创建结点
*/
SaveEleNametemp=(SaveEleName)ele.next();
Elementtempelement=doc.createElement(temp.getElementName());
Texttemptextelement=doc.createTextNode(rs.getString(temp.getIndex()).trim());
tempelement.appendChild(temptextelement);
rootchildelement.appendChild(tempelement);
}
attri=attrilist.iterator();//重复循环到集合中取值,下同
ele=elelist.iterator();
}
}
catch(Exceptione)
{
e.printStackTrace();
}
writeXml(doc);
}
privatevoidwriteXml(Documentdoc)
{
try
{
FileOutputStreamoutStream=newFileOutputStream(url);
OutputStreamWriteroutWriter=newOutputStreamWriter(outStream);
((XmlDocument)doc).write(outWriter,"GB2312");
outWriter.close();
outStream.close();
System.out.print("\nWritexmlfilesuccessful!\n");
}
catch(Exceptione)
{
e.printStackTrace();
}
}
}

讲解:
假设数据库中有一个表,表名为“CCNUstudents”,
表中有几条记录,现将它转换为xml文件,我转换的规则为将记录的关键字作为元素的属性,其它作为了结点。当然,你也可以以自己的规则将数据库中的任何字段设置为属性或元素。所有元素及属性的名称可以自定义,表中的内容为:

学号姓名学校系别家庭住址
20033274邪华中师范大学信息管理系湖北省监利县龚场镇
20043225阿维中南民族大学经济系湖北省监利县周老咀镇

假设关键字段为“学号”,则可将此表转换为一个xml文件:
示例代码如下:
文件test.java中测试函数的内容:

publicstaticvoidmain(String[]args)throwsException
{
SQLExecuteconn=newSQLExecute();
ResultSetrs=conn.sqlQuery("select*fromCCNUstudents");
CreateXmlFilecreate=newCreateXmlFile(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文件,文件内容为:

<?xmlversion="1.0"encoding="GB2312"?>

<学生基本信息>

<学生学生学号="20033274">
<学生的姓名>邪</学生的姓名>
<所在学校>华中师范大学</所在学校>
<所在系>信息管理</所在系>
<住址>湖北省监利县龚场镇</住址>
</学生>

<学生学生学号="20043225">
<学生的姓名>阿维</学生的姓名>
<所在学校>中南民族大学</所在学校>
<所在系>经济系</所在系>
<住址>湖北省监利县周老咀镇</住址>
</学生>

</学生基本信息>

当然,如果数据表中有多个关键字,也可以在程序中指定多个属性。
至此,一个xml文件就产生了。当然,为求程序简便,关于xml文件中的命名空间、CDATA都没有作处理。希望可以起到抛砖引玉的作用。
程序流程及逻辑可以参看类中的注释~。
(-小邪(QQ:156411203,欢迎交流)-2006.7.21)。
最后补充一点,你并不需要为每一个查询结果集中的字段都指派相应的元素或属性名,而只需根据你自己的需要,为你想要储存到xml文件中的那些字段指派名称就可以了,最后,别忘记了调用designOver()函数,告诉程序表示已经指派完毕了!^_^

注:本文转自http://bbs.xml.org.cn/dispbbs.asp?boardID=17&replyID=75002&ID=41933&skin=1

分享到:
评论

相关推荐

    XML高级编程pdf

    8.6.2 关系型数据库和XML文档之间的区别 8.6.3 XML查询语言的发展历史 8.6.4 使用Xpath和XSLT查询XML文档 8.6.5 查询语言展望 8.7 小结 第9章 转换 XML 9.1 为什么转换 XML 9.1.1 在不同词汇表之间转换 ...

    XML 高级编程(高清版)

    8.6.2 关系型数据库和XML文档之间的区别 8.6.3 XML查询语言的发展历史 8.6.4 使用Xpath和XSLT查询XML文档 8.6.5 查询语言展望 8.7 小结 第9章 转换 XML 9.1 为什么转换 XML 9.1.1 在不同词汇表之间转换 ...

    XML高级编程 (Extensible Markup Language)

    8.6.2 关系型数据库和XML文档之间的区别 8.6.3 XML查询语言的发展历史 8.6.4 使用Xpath和XSLT查询XML文档 8.6.5 查询语言展望 8.7 小结 第9章 转换 XML 9.1 为什么转换 XML 9.1.1 在不同词汇表之间转换 ...

    XML高级编程

    8.6.2 关系型数据库和XML文档之间 的区别 291 8.6.3 XML查询语言的发展历史 295 8.6.4 使用Xpath和XSLT查询XML文档 298 8.6.5 查询语言展望 309 8.7 小结 309 第9章 转换 XML 310 9.1 为什么转换 XML 311 9.1.1 在...

    cnki2xml:Python脚本:将cnki导出的文献转化为Papers:registered: for Mac可导入的Endnote:registered: XML文件

    适用于Mac的Python脚本:将cnki导出的文献转化为Papers:registered:可导入的Endnote:registered:XML文件 Endnote:registered:的导入文件中的标签和引用对应列表: 标签EndNote通用字段名称 %A作者 %B次要标题...

    C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例

    前不久因为项目的需要写的一个C#把DataSet内数据转化为Excel和Word文件的通用类,这些关于Excel、Word的导出方法,基本可以实现日常须要,其中有些方法可以把数据导出后 生成Xml格式,再导入数据库!有些屏蔽内容没有...

    SqlToolBox 1.8.2

    SqlToolBox是一款纯绿色的免费数据库客户端软件,基于Java Swing编制而成,旨在于为开发人员,系统工程师和数据库管理员提供一种通用方便和快捷的数据库操作工具,使他们摆脱需要学习掌握使用多种数据库客户端的苦恼...

    ASP200问.EXE

    145.如何通过XMLDom在服务器端操作XML文件(示例二) 146.如何使用XML实现不刷新页面查询数据库 147.如何把HTML表单提交的数据转化成XML文件(第一步) 147.如何把HTML表单提交的数据转化成XML文件(第二步) 148....

    C#开发经验技巧宝典

    0980 将Access数据库转化为SQL Server数据库 570 0981 将SQL Server数据库转化为Access数据库 571 0982 如何避免数据库死锁现象 572 0983 如何调用带输入参数的存储过程 572 0984 如何获取存储过程返回的...

    Delphi开发范例宝典目录

    实例285 将数据库统计信息保存为Excel文件 372 实例286 将数据库数据导出为HTML格式文件 375 实例287 将数据库内容导出为文本文件 377 8.9 数据库其他操作 379 实例288 系统错误记录 379 实例289 如何将...

    asp.net知识库

    将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005 ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 ...

    C#基类库(苏飞版)

    3.把Byte流上传到指定目录并保存为文件 复制代码 UpLoadFiles 页面专用类 19.时间操作类 DateFormat 返回每月的第一天和最后一天 复制代码 TimeHelper 1.将时间格式化成 年月日 的形式,如果时间为null,返回当前...

    MVC to LinQ

    数据库、业务对象、XML文件、一个数据集 1、所需要数据均出自相同的数据源,可能性很小。数据库、业务对象、XML文件、一个数据集,Web服务端 2、访问数据的难易程度完全取决于数据的存储位置。访问一个内存中的对象...

    Winson.Framework 1.0发布!

    3、可直接使用XML文件为实体 4、可设置是否需要缓存,同时可设置缓存文件依赖存放的位置 5、可支持多语言的数据库自定义错误信息,现在支持简体和繁体2种 6、可设置是否启用错误日志记录 7、可设置...

    新版Android开发教程.rar

    将会支持 Google 可能发布的手机操作系统或者应用软件,共同开发名为 Android 的开放源代码的移动 系 统。 谷歌早在 2002 年就进入了移动领域,可是由于目前的手机操作系统企业和手机企业相对封闭,提高了 行业的...

    C#编程经验技巧宝典

    70 &lt;br&gt;0096 如何将数字转换为字符串 70 &lt;br&gt;0097 如何将字符串转换为数字 70 &lt;br&gt;0098 如何将数字转换为日期格式 71 &lt;br&gt;0099 如何将数字转换为货币格式 71 &lt;br&gt;0100 将字母全部转换大写 ...

    axublog v1.1.1.rar

    由于这个kindeditor文件默认所有的上传插件是通用的, 所以上传视频等其他文件时,可点击“所有文件” 后台插件改进 添加“生成今日内容”页面功能,可对今日采集的内容一键生成html页面 发布“微信百度采集插件...

Global site tag (gtag.js) - Google Analytics