JAVA MYSQL 转 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));elseelelist.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"><学生的姓名>阿维</学生的姓名><所在学校>中南民族大学</所在学校><所在系>经济系</所在系><住址>湖北省监利县周老咀镇</住址></学生</学生基本信息>”这是网上的一个帖子用这个方法可以解决现在MYSQL生成了XML但是生成的结构还不是符合我的要求。我想生成如下这样:<?xmlversion="1.0"encoding="GB2312"?><学生基本信息><学生学生学号="20033274"><学生学生的姓名="邪"所在学校="华中师范大学"所在系="信息管理"住址="湖北省监利县龚场镇"/></学生><学生学生学号="20043225"><学生学生的姓名="阿维"所在学校="中南民族大学"所在系="经济系"住址="湖北省监利县周老咀"/></学生></学生基本信息>搞了2天都不明白怎么搞。。。。求大大基于这个帖子改下可以解决啊快疯了。要交工了。。。。打击一个新人自信啊。。。十分感谢

解决方案

本帖最后由 qianzhou273 于 2010-12-11 15:51:57 编辑
解决方案二:
在线等
解决方案三:
关键在于你的代码太多了而且太乱了..你说的也很乱,根本就没心思看下去
解决方案四:
该回复于2010-12-13 09:00:41被版主删除
解决方案五:
用字串相加會不會比較快。
解决方案六:
你找的这个方法,建议你去看看JDK的JAXB,MarshalJavaobjecttoxml。或者你搜索一下javaobjecttoxml,这样开源的项目非常多。如果数据量比较多,用DOM方法生成XML会出问题的。加上你只需要生成XML文件即可,而不需要获得DOM对象,所以最好的方法是直接写文件,这样效果最好。请参考以下代码,其中bw.newLine()可以不调用。//createfileforoutputBufferedWriterbw=newBufferedWriter(newFileWriter(fileName));bw.write("<?xmlversion="1.0"encoding="UTF-8"?>");bw.newLine();bw.write("<学生基本信息>");bw.newLine();//getrecordsfromtableResultSetrs=stmt.executeQuery("SELECT...FROMTABLE");while(rs.netxt()){//writeeachrecordbw.write("<学生学生学号='");bw.write(rs.get("学生学号"));bw.write("'>");bw.write("<学生学生的姓名='");bw.write(rs.get("学生学号"));bw.write("'所在学校='");...write("'/>");bw.write("</学生">);bw.newLine();}bw.write("</学生基本信息>");bw.newLine();//closethefilebw.flush();bw.close();

时间: 2024-11-25 21:42:24

JAVA MYSQL 转 XML 生成的XML 的结构的问题 急急啊 求大大解决 新手快崩溃了的相关文章

Java使用DSA密钥对生成XML签名的方法_java

本文实例讲述了Java使用DSA密钥对生成XML签名的方法.分享给大家供大家参考.具体实现方法如下: MainClass.java代码如下: 复制代码 代码如下: import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.util.Collections; import javax.xml.crypto.dsig.Canon

Myeclipse自动生成java的Bean和BeanName.hbm.xml文件(java项目必须支持Hibernate)

在javaEE开发中,我们在支持Hibernate之后,想使用Myeclipse自动生成java的Bean和BeanName.hbm.xml文件(Oracle12c为例): 注:以下提到"BeanName"为您使用的java class name. 1:创建一个java项目让他支持Hibernate(因为需要给后面生成的bean找一个存放目录) 2:切换视图到MyEclipse Hibernate,如图: 3:在空白处点击新建(New...),创建一个新的数据库连接,如图: 注: Or

java中四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)_java

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.net/projects/dom4j/  一.介绍及优缺点分析

帮忙看看下面的实体类是怎么生成的?XML生成JAVA 实体类

问题描述 ////ThisfilewasgeneratedbytheJavaTMArchitectureforXMLBinding(JAXB)ReferenceImplementation,v2.2.4-2//See<ahref="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>//Anymodificationstothisfilewillbelostuponrecompilation

ssh框架web,自动生成hbm.xml和实体类

问题描述 ssh框架web,自动生成hbm.xml和实体类 ssh框架web,数据库由MySQL变oracle,myeclipse自动生成hbm.xml和实体类,Injection of resource dependencies failed.org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'BHZControl': Injection of resource depe

使用XSLT作为语言编译器-使用XSLT从XML生成PostScript

简介:探究使用 XSLT 作为编程语言编译器(尤其是在 PostScript 之前创建 XML 层)从 XML 文档生成 PostScript 文件的概念.本文将介绍样式表作为隐式语言定义的概念.PostScript 的基础知识以及创建 XML 到 PostScript 的编译器时涉及到的抽象层. 使用 XSLT 作为编译器 使用 XSLT 可以将 XML 数据转换成任意的其他数据格式.通常 XSLT 被视为 XML 到 XML 的转换语言,它以 XML 文档为输入并将其转换为其他 XML 结构

android 如何在java代码中方便的调用xml写的布局??

问题描述 android 如何在java代码中方便的调用xml写的布局?? 我想在activity刷新的时候重新生成一些xml写的布局,并放在 "求学"那一栏下: 想问一下有没有什么方便的方法??? 解决方案 可控的话 先加载求学哪里 先设visible为gone. 需要的时候设置为visible 解决方案二: 楼上说得对,先把控件实例化然后把visiblity设为gone 然后调用刷新按钮的时候吧实例传过去,再重新设置visiblity 解决方案三: 一种是隐藏然后显示,最好是用动态

Java利用JDom解析和传递XML格式数据

java利用JDom来解析处理XML数据格式: 需要的包jdom-1.1.2.jar 1.将数据转换成XML格式的数据进行传递 Element rootList, firstList, secondItem, thirdItem; //根元素标签名 rootList = new Element("root"); //根元素标签内的属性名与值 rootList.setAttribute("project", pname); //生成Doc文档 Document Doc

Android中常用的XML生成方法实例分析_Android

本文实例讲述了Android中常用的XML生成方法.分享给大家供大家参考.具体如下: 1. java代码: package com.android.antking.xml; import java.io.OutputStream; import java.util.List; import org.xmlpull.v1.XmlSerializer; import android.util.Xml; /**采用pull 生成xml文件 * * @author antkingwei * */ pub