以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XML 与 数据库 』  (http://bbs.xml.org.cn/list.asp?boardid=17)
----  [原创]求助:抽取MYSQL数据库数据,并转换成XML数据  (http://bbs.xml.org.cn/dispbbs.asp?boardid=17&rootid=&id=62001)


--  作者: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();这行。请各位指点


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
117.188ms