用java语言将数据库中的数据表转换为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