-- 作者:xiaochaoshou
-- 发布时间:4/29/2008 9:31:00 PM
-- [原创]求助:抽取MYSQL数据库数据,并转换成XML数据
程序代码如下: package jdommysql; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Connection; //import java.sql.Date; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; public class T_mysqlxml { public static void main(String[] args) { // 创建一个文档 Document mapdoc=null; //定义一个新的文档 Document datadoc=null; //创建一个新的文档 Document newdoc=null; try { //构造文档对象 SAXBuilder sb=new SAXBuilder(); //SAXBuilder类,一般用于文档的创建工作 mapdoc=sb.build("XMLOFMYSQL/mapmysql.xml");//根据映射文件maporaxs.xml创建mapdoc文档 } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //获取根元素 Element maproot=mapdoc.getRootElement(); int ListSize; List TableList=maproot.getChildren("data");//将表的名称存入到TableList中 ListSize=TableList.size(); Element mapdatabase=maproot.getChild("database"); String drivername=mapdatabase.getAttributeValue("drivername"); String URL=mapdatabase.getAttributeValue("urlname"); String username = mapdatabase.getAttributeValue("username"); String password = mapdatabase.getAttributeValue("password"); Connection con=null; try { Class.forName(drivername); con=DriverManager.getConnection(URL,username,password); } catch (ClassNotFoundException e) { System.out.println("Error creating class: "+e.getMessage()); } catch (SQLException e) { System.out.println("Error creating connection: "+e.getMessage()); } //create the statement object Statement st=null; //create the resultset object ResultSet rt=null; //create the resultmetadata object ResultSetMetaData rsmd=null; Element tableelement; //定义一个根元素 datadoc= new Document(new Element("XmlInformationOfMysqlTable")); try{ for(int i=0;i<ListSize;i++) { tableelement=(Element)TableList.get(i); String listname=tableelement.getAttributeValue("tablename"); //从TableList中依次取出每个表,然后用SELECT查询表中的所有字段 String SQL="SELECT * FROM"+" "+listname; if (tableelement.getAttributeValue("condition").isEmpty()) { } else { SQL=SQL+" where "+tableelement.getAttributeValue("condition"); } System.out.println(SQL); //将表名作为元素名 Element TableElement = new Element(tableelement.getAttributeValue("tablename")); st=con.createStatement(); rt=st.executeQuery(SQL); //执行查询 rsmd = rt.getMetaData();//获取元数据,如属性名等 int colcount = rsmd.getColumnCount();//获取属性列的个数 while (rt.next()) { Element RowElement = new Element("ROW"); //每一个元组构成一个元素“ROW”,“ROW”中的子元素就是元组中的属性 //取出元组中的每一个属性名和属性的取值 //属性名作为元素名,属性的取值作为元素的内容 for (int j = 1; j <= colcount; j++) { Element TempElement=new Element(rsmd.getColumnName(j).toString()); TempElement.setText(rt.getString(j)); RowElement.addContent(TempElement); } //将每一个“ROW”元素作为以表名作为元素名元素的子元素 TableElement.addContent(RowElement); } //添加到根元素中 datadoc.getRootElement().addContent(TableElement); } } catch (SQLException e) { System.out.println("SQL Error: "+e.getMessage()); } finally{ System.out.println("Closing connections......"); try { con.close(); } catch (SQLException e) { System.out.println("Can't close connection"); } } List tablelist=maproot.getChildren("table");//取得映射文件中table元素的个数 String newrootword=maproot.getChild("root").getAttributeValue("name"); newdoc= new Document(new Element(newrootword)); Element newrow,newrowlist,tableelement1,tableelement2; String maprow = null,maprowlist = null; List rowlist = null; for(int i=0;i<tablelist.size();i++){ tableelement1=(Element)tablelist.get(i); //取得table元素中的表 String listname=tableelement1.getAttributeValue("row"); tableelement2=(Element)TableList.get(i); //取得data元素中的表 if(listname.equals(tableelement2.getAttributeValue("tablename"))){ rowlist=tableelement1.getChildren(); maprow=tableelement1.getAttributeValue("row"); maprowlist=tableelement1.getAttributeValue("rowname"); //break; } newrow=new Element(maprow); Element dataroot=datadoc.getRootElement(); List oldlist=dataroot.getChildren();//取得dataroot中的表 Element dataelement1=(Element)oldlist.get(i); //取得dataroot中的第一个表 List oldlist1=dataelement1.getChildren();//取得T_XUESHENG中的子元素,即5个ROW元素 for(int j=0;j<oldlist1.size();j++){ Element dataelement=(Element)oldlist1.get(j); newrowlist=new Element(maprowlist); for(int k=0;k<rowlist.size();k++){ Element mapelement=(Element)rowlist.get(k); String mapcontent=mapelement.getChild("content").getText(); String datacontent=dataelement.getChild(mapcontent).getText().toString(); String elementname=mapelement.getAttributeValue("name"); Element newcolumn=new Element(elementname); newcolumn.setText(datacontent); newrowlist.addContent(newcolumn); } //把列元素添加到一个newrow中 newrow.addContent(newrowlist); } newdoc.getRootElement().addContent(newrow); } try { Format format = Format.getCompactFormat(); format.setEncoding("gb2312"); //设置xml文件的字符为gb2312 format.setExpandEmptyElements(true); //设置输出空元素为<sample></sample>格式 format.setIndent(" "); //设置xml文件的缩进为4个空格 XMLOutputter output = new XMLOutputter(format); output.output(mapdoc, new FileOutputStream("XMLOFMYSQL/test1.xml")); //输出XML文档 output.output(datadoc, new FileOutputStream("XMLOFMYSQL/test2.xml")); //输出XML文档 output.output(newdoc, new FileOutputStream("XMLOFMYSQL/test3.xml")); //输出XML文档 System.out.print("XML 文档生成完毕!"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 在编译的时候报错:Exception in thread "main" java.lang.NullPointerException at jdommysql.T_mysqlxml.main(T_mysqlxml.java:206) 报错里面的206也就是 String datacontent=dataelement.getChild(mapcontent).getText().toString();这行。请各位指点
|