你是想要读取xml的代码还是其他的??
你所说的SQL语句,是什么意思,你是想用类似SQL语句的格式(select deptid,deptname from data.xml where .....)从XML文件中读取数据吗??如果是那就不难。

解决方案 »

  1.   

    上面的xml是三个表(user,group,dept)的数据,我想通过java程序解析此xml文件,然后相成相应的insert into user(、、、、)values(、、、、);
            insert into group(、、、、)values(、、、、);
            insert into group(、、、、)values(、、、、);
            insert into group(、、、、)values(、、、、);
            insert into dept(、、、、)values(、、、、);
         几条 sql语句。
      

  2.   

    “然后相成相应的insert into user(、、、、)values(、、、、);”
    是生成相应的吧。
    哦,你是说得到这些值,然后用这些生成的SQL语句把XML中的值插入到数据库中去??
      

  3.   

    首先你需要一个使用一个dom解析器,现在常用的是jdom ,这个解析器使用起来简单方便。
    我一会把代码贴出来。
      

  4.   

    程序如下,其中没有考虑到字段的数据类型,都是按照字符串处理的,如果有其他如日期等数据类型,则应该在xml中添加字段类型属性。其中需要jdom包,可以在网上下载。或者直接在jbuilder中引入。我是在jbuilder7中调试通过的。
    package test;
    import org.jdom.*;
    import org.jdom.input.*;
    import java.io.*;
    import java.util.*;
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author unascribed
     * @version 1.0
     */
    /**
     * 思路:对二级节点进行便利,然后把每一个元素作为
     *
     * */
    public class Haha {  public Haha() {
      }
      public static void main(String args[]){
        try {
          SAXBuilder saxb = new SAXBuilder();
       //从文件构造一个Document,因为XML文件中已经指定了编码,所以这里不必了
         Document doc = saxb.build(new FileInputStream("data.xml"));
           Element root = doc.getRootElement(); //得到根元素
           //得到子元素的个数,也就是要处理count条sql语句
           int layer1Count = root.getChildren().size();       List elements = root.getChildren(); //得到根元素所有子元素的集合
           Element firstElement;
           StringBuffer sb = new StringBuffer(); //用来保存sql语句的前半部分
           for (int i = 0; i < layer1Count; i++) {
             firstElement =(Element)elements.get(i);
            // System.out.println(firstElement.getName()) ;//打印出表的名字
             int layer2Count = firstElement.getChildren().size();
             StringBuffer value = new StringBuffer();
             Element secondElement;
             sb.append("insert into "+ firstElement.getName() + "(");
             value.append("values(");
             for (int j = 0; j < layer2Count; j++) {
               secondElement = (Element)firstElement.getChildren().get(j);
               sb.append(secondElement.getName()+",");
               value.append("'"+secondElement.getText()+"',");
             }
             sb.deleteCharAt(sb.length()-1); //删除多余的","
             value.deleteCharAt(value.length()-1); //删除多余的","
             sb.append(")");
             value.append(")");
             System.out.println(sb.toString()+value.toString());
             sb.delete(0,sb.length());
             value.delete(0,value.length());
         }
        }
        catch (Exception ex) {
          ex.printStackTrace();
        }  }
    }
      

  5.   

    你还有其他的理解??
    该程序的输出是结果是
    insert into user(userid,username,password,email,userstatus,groupid,deptid)values('001','zhangxj','123456','[email protected]','1','1','1')insert into group(groupid,groupname,grouper,groupdesc)values('1','项目一组','王岗','网络软件开发')insert into group(groupid,groupname,grouper,groupdesc)values('2','项目二组','刘武','医疗软件的开发')insert into group(groupid,groupname,grouper,groupdesc)values('2','项目三组','李奋','软件的测试维护')insert into dept(deptid,deptname,depter,number,desc)values('1','软件部','张则','20','it事业部')
      

  6.   

    /*
    Author: ejbcreate
    */
    import java.io.*;
    import java.util.Vector;
    import org.w3c.dom.*;
    import org.xml.sax.*;
    import org.apache.xerces.parsers.DOMParser;public class DealXml
    {
    public static void main(String[] args)
    {
    String lFilePath = "C:\\DealXml\\data.xml";
    try
    {
    DealXml lDealXml = new DealXml();         
    InputSource lInSource = lDealXml.readXmlFile(lFilePath);
    System.out.println("lInSource = "+lInSource);
    Vector lVect = lDealXml.processXML(lInSource);
    System.out.println("lVect.size() = "+lVect.size());
    Vector lSqlVect = lDealXml.generateSql(lVect);
    System.out.println("lSqlVect.size() = "+lSqlVect.size());
    for(int i=0; i<lSqlVect.size(); i++)
    {
    System.out.println("SqlStr_"+i+" = "+lSqlVect.elementAt(i));
    }
    }
    catch(Exception ex)
    {
    System.out.println("main() Excpt: "+ex.toString());
    }
    }    public InputSource readXmlFile(String rFilePath) throws IOException
    {
    File        lFile     = null;
    InputSource lInSource = null;
    InputStream lInStream = null;
    try
    {
        if(rFilePath == null && rFilePath.equals(""))
    return lInSource;
    //lFile = new File(rFilePath);
    //lInStream = new FileInputStream(lFile);
    lInStream = new FileInputStream(rFilePath);
    lInSource = new InputSource(lInStream);
    //lInStream.close();
    }
    catch(Exception ex)
    {
    System.out.println("Excpt: "+ex.toString());
    if(lInStream != null)
    lInStream.close();
    }
    return lInSource;
    } //※※功能说明:返回一个由XML包拆分的Vector,其中Vector里装着二维数组。
    public Vector processXML(InputSource rIS)
    {
     Vector     lVect      = null;
     String[][] lArrayValue = null;
     try{
    if(rIS == null)
    return lVect;
    DOMParser lDB = new DOMParser(); lDB.parse(rIS); Document lDoc  = lDB.getDocument();
                    //Element  lRoot = lDoc.getDocumentElement();
    lVect = new Vector();

    NodeList lUserNodeList = lDoc.getElementsByTagName("user");
    int lUserNodeCounts = lUserNodeList.getLength();
    for(int i=0; i<lUserNodeCounts; i++)
        {
    NodeList lUserChildNodeList = ((Node)lUserNodeList.item(i)).getChildNodes();
    int lUserChildCounts = lUserChildNodeList.getLength();
    Vector lElemNodeVect = new Vector();
    for(int k=0; k<lUserChildCounts; k++)
    {
    if(lUserChildNodeList.item(k).getNodeType() == Node.ELEMENT_NODE)
    {
        lElemNodeVect.add((Node)lUserChildNodeList.item(k));
    }
    }
    lArrayValue = new String[lElemNodeVect.size()+1][2];
    lArrayValue[0][0] = "table";
    lArrayValue[0][1] = "user"; for(int j=0; j<lElemNodeVect.size(); j++)
    {
    String lName  = ((Node)lElemNodeVect.elementAt(j)).getNodeName();
    String lValue = ((Node)lElemNodeVect.elementAt(j)).getFirstChild().getNodeValue();
    System.out.println("lValue = "+lName);
    System.out.println("lValue = "+lValue); lArrayValue[j+1][0] = lName;
    lArrayValue[j+1][1] = lValue;
    }
    lVect.add(lArrayValue);
    } NodeList lGroupNodeList = lDoc.getElementsByTagName("group");
    int lGroupNodeCounts = lGroupNodeList.getLength();
    for(int i=0; i<lGroupNodeCounts; i++)
        {
    NodeList lGroupChildNodeList = ((Node)lGroupNodeList.item(i)).getChildNodes();
    int lGroupChildCounts = lGroupChildNodeList.getLength();
    Vector lElemNodeVect = new Vector();
    for(int k=0; k<lGroupChildCounts; k++)
    {
    if(lGroupChildNodeList.item(k).getNodeType() == Node.ELEMENT_NODE)
    {
        lElemNodeVect.add((Node)lGroupChildNodeList.item(k));
    }
    }
    lArrayValue = new String[lElemNodeVect.size()+1][2];
    lArrayValue[0][0] = "table";
    lArrayValue[0][1] = "group"; for(int j=0; j<lElemNodeVect.size(); j++)
    {
    String lName  = ((Node)lElemNodeVect.elementAt(j)).getNodeName();
    String lValue = ((Node)lElemNodeVect.elementAt(j)).hasChildNodes() == true?((Node)lElemNodeVect.elementAt(j)).getFirstChild().getNodeValue():"";
    System.out.println("lValue = "+lName);
    System.out.println("lValue = "+lValue); lArrayValue[j+1][0] = lName;
    lArrayValue[j+1][1] = lValue;
    }
    lVect.add(lArrayValue);
    } NodeList lDeptNodeList = lDoc.getElementsByTagName("dept");
    int lDeptNodeCounts = lDeptNodeList.getLength();
    for(int i=0; i<lDeptNodeCounts; i++)
        {
    NodeList lDeptChildNodeList = ((Node)lDeptNodeList.item(i)).getChildNodes();
    int lDeptChildCounts = lDeptChildNodeList.getLength();
    Vector lElemNodeVect = new Vector();
    for(int k=0; k<lDeptChildCounts; k++)
    {
    if(lDeptChildNodeList.item(k).getNodeType() == Node.ELEMENT_NODE)
    {
        lElemNodeVect.add((Node)lDeptChildNodeList.item(k));
    }
    }
    lArrayValue = new String[lElemNodeVect.size()+1][2];
    lArrayValue[0][0] = "table";
    lArrayValue[0][1] = "dept"; for(int j=0; j<lElemNodeVect.size(); j++)
    {
    String lName  = ((Node)lElemNodeVect.elementAt(j)).getNodeName();
    String lValue = ((Node)lElemNodeVect.elementAt(j)).hasChildNodes() == true?((Node)lElemNodeVect.elementAt(j)).getFirstChild().getNodeValue():"";
    System.out.println("lValue = "+lName);
    System.out.println("lValue = "+lValue); lArrayValue[j+1][0] = lName;
    lArrayValue[j+1][1] = lValue;
    }
    lVect.add(lArrayValue);
    }
            }
            catch (Exception ex) {
              System.out.println("错误时间:"+new java.util.Date());            
              System.out.println("错误代码:"+ex.getMessage());
            }
            return lVect;
    } public Vector generateSql(Vector rVector)
    {
            Vector lSqlStrVect = null;
    //StringBuffer lSB   = null;
    try
    {
    if(rVector == null) return lSqlStrVect;
                lSqlStrVect = new Vector();
                for(int i=0; i<rVector.size(); i++)
    {
    //lSB = new StringBuffer("insert into ");
    String lSqlStr    = "insert into ";
    String lFieldName ="";
    String lValues    ="";
    String[][] lArray = (String[][])rVector.elementAt(i);
    lSqlStr += lArray[0][1];
    for(int j=1; j<lArray.length; j++)
    {
    lFieldName += lArray[j][0] + ",";
    lValues    += "'"+lArray[j][1] + "',";
    }
    if(lFieldName != null && !lFieldName.equals(""))
    lFieldName = lFieldName.substring(0, lFieldName.length()-1);
    if(lValues != null && !lValues.equals(""))
    lValues = lValues.substring(0, lValues.length()-1);
        lSqlStr += "("+lFieldName+")"+" values("+lValues+")";
    System.out.println("lSqlStr_"+i+" = "+lSqlStr);
    lSqlStrVect.addElement(lSqlStr);
    }
    }
    catch(Exception ex)
    {
    System.out.println("Excpt: "+ex.toString());
    }
    return lSqlStrVect;
    }
    }
      

  7.   

    比cust(wanda)兄的长了很多(但输出结果是一样的),可能是我的算法不够好,
    自己感觉有好多地方写得很混乱,本来想写成递归的,这样可扩展性好很多,程序也会精悍许多,但时间关系,现在只能做到这一步。//呵呵。我已经测试过,在我的环境下可以运行的了。
      

  8.   

    to ejbcreate() :知道xml文件的层次机构以后,不要手工的去处理每个标签,直接用程序读出来扩展性会好一些。我的程序里面其实有有漏洞的,不过主要目的是为了给楼主演示。
      

  9.   

    呵呵,用XPath,结构简单明确,代码简洁,一级棒。
      

  10.   

    通过dom解析器把xml文档读取出来,(详见xml帮助文档微软网站有下载)然后再通过insert语句插入
      

  11.   

    To  cust(wanda) :是的,我本来是想用一个递归来取数据。不过,限于时间问题,只写了这个来代替了。To whodsow(whodsow) :用XPath? 我用它来把XML转换为HTML来在浏览器显示。请问可以把你写的代码贴出来么?让我学习一下。多谢先。
      

  12.   

    需要注意的是,如果xml文件中的字段值为空,或者含有单引号,则你需要自己处理一下。前者可能引发对象为空的异常,后者输出的sql语句就会出现错误,如字段名为col1,字段值为a',现在的程序生成的语句是insert into table1(col1) values('a''),但是我们需要把含有单引号的内容替换成insert into table1(col1) values('a''')