<?xml version="1.0" encoding="gb2312"?>
<IfInfo>
<purchaseResults>
<purchaseResult>
    <resultID>方采购结果ID</resultID>
<resultTitle>采购结果名称</resultTitle>
<bluePriceID>采购方案ID</bluePriceID>
<bluePriceTitle>采购方案名称</bluePriceTitle>
<purchaseType>采购方式</purchaseType>
<demandType>需求类型</demandType>
<startDate>结果启动时间</startDate>
<projectID>项目ID</projectID>
<projectTitle>项目名称</projectTitle>
<projectManager>项目负责人</projectManager>
<purchaseManager>采购负责人</purchaseManager>
<totalSum>合计</totalSum>
<approvedDate>评标时间</approvedDate>
<summary>招标评审基本情况</summary>
<purchaseResultList>
<list>
                     <listId>方采购结果明细ID</listId>
<materialType>规格型号</materialType>
<supplierName>供应商名称</supplierName>
<agentName>代理商名称</agentName>
<total>数量</total>
<price>成交单价</price>
</list>
<list>
                     <listId>方采购结果明细ID</listId>
<materialType>规格型号</materialType>
<supplierName>供应商名称</supplierName>
<agentName>代理商名称</agentName>
<total>数量</total>
<price>成交单价</price>
</list>
<list>
                     <listId>方采购结果明细ID</listId>
<materialType>规格型号</materialType>
<supplierName>供应商名称</supplierName>
<agentName>代理商名称</agentName>
<total>数量</total>
<price>成交单价</price>
</list>
</purchaseResultList>
</purchaseResult>
<purchaseResult>
    <resultID>采购结果ID</resultID>
<resultTitle>采购结果名称</resultTitle>
<bluePriceID>采购方案ID</bluePriceID>
<bluePriceTitle>采购方案名称</bluePriceTitle>
<purchaseType>采购方式</purchaseType>
<demandType>需求类型</demandType>
<startDate>结果启动时间</startDate>
<projectID>项目ID</projectID>
<projectTitle>项目名称</projectTitle>
<projectManager>项目负责人</projectManager>

<purchaseManager>采购负责人</purchaseManager>
<totalSum>合计</totalSum>
<approvedDate>评标时间</approvedDate>
<summary>招标评审基本情况</summary>
<purchaseResultList>
<list>
                     <listId>方采购结果明细ID</listId>
<materialType>规格型号</materialType>
<supplierName>供应商名称</supplierName>
<agentName>代理商名称</agentName>
<total>数量</total>
<price>成交单价</price>
</list>
<list>
                     <listId>方采购结果明细ID</listId>
<materialType>规格型号</materialType>
<supplierName>供应商名称</supplierName>
<agentName>代理商名称</agentName>
<total>数量</total>
<price>成交单价</price>
</list>
<list>
                     <listId>方采购结果明细ID</listId>
<materialType>规格型号</materialType>
<supplierName>供应商名称</supplierName>
<agentName>代理商名称</agentName>
<total>数量</total>
<price>成交单价</price>
</list>
</purchaseResultList>
</purchaseResult>
</purchaseResults>
</IfInfo>

解决方案 »

  1.   

    想将这个传输过来的xml通过解析之后插入到两个数据库表里去,明白了吗?
      

  2.   

    方法很多,關鍵看用哪一種了.
    ----------
    比較快的自己不寫一行代碼的.
    1.先用xmlspy生成一個schema
    2.用java 的JAXB 技術就可以了生成解析的類了 
      

  3.   

    看看这个链接吧
    使用 xstream ,在实体类和 xml 之间互相转换http://www.cnblogs.com/stephencat/archive/2007/06/05/772570.html
      

  4.   

    不知道在用 xstream 对于XML文档的最大存储容量有没有极限..............如果一个XML 文档大于3M以上时,,,能够快速转换吗???
      

  5.   

    不知道!我也是刚刚接触 xstream 但是XML文件有超过 3M 的吗?
    如果超过 3M,就使用数据库了吧
      

  6.   

    1,如果只是解析xml文件,那有好多方法,如dom ,dom4j,jdom,sax等
    2,如果是想向数据库中导入的话,可以使用Xml2OleDb将XML文档插入到数据库,
      

  7.   

    (1)建立连接:
     
    首先必须使用Class.forName(String dbDriverClassname)方法检查是否安装了适当的JDBC驱动程序。这个方法是用来动态加载类的,dbDriverClassname是驱动程序类的名称。加载了驱动程序后,使用java.sql包中的DriverManager类中的getConnection()方法可以建立数据库连接,这个方法有三种形式:
    java 代码
    public static synchronized Connection getConnection(String url) throws SQLException    
    public static synchronized Connection getConnection(String url,String user,String pwd)  throws SQLException    
    public static synchronized Connection getConnection(String url, java.util.Properties info) throws SQLException   (2)执行SQL语句并取回结果:
     
    创建了数据库连接后,当我向数据库库发出一个SQL查询时,首先要做的事情是使用Connection对象的方法创建一个Statement、PreparedStatement或者CallableStatemet;一旦有了这些语句(statement)对象中的任一个,就可以执行该语句并通过ResultSet对象读出查询结果(如果查询有返回结果的话)。
      
    java 代码
    Statement createStatement() throws SQLException    
    Statement createStatement(int resultSetType , int resultSetConcurrency) throws SQLException    
    PreparedStatement prepareStatement(String sql) throws SQLException    
    PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException    
    CallableStatement prepareCall(String sql) throws SQLException    
    CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException   在对 BLob 和 Clob 型字段进行读写操作时,需要一个可以生成可滚动和/或可更新的 ResultSet 对象,否则 JRE 会告诉你“记录没有锁定”。但是,默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。因此,你需要使用下面的方式产生一个 ResultSet 对象:
    java 代码
    Statement stmt = con.createStatement(    
                                   ResultSet.TYPE_SCROLL_INSENSITIVE,    
                                   ResultSet.CONCUR_UPDATABLE);    
    ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");    
    // rs will be scrollable, will not show changes made by others,    
    // and will be updatable   
     
     
     
    你可能对上面加粗的代码感到疑惑,没关系,我这里将其所有的可用参数做了一个总结:
     --------------------------------------------------------------------------------CLOSE_CURSORS_AT_COMMIT
              该常量指示调用 Connection.commit 方法时应该关闭 ResultSet 对象。CONCUR_READ_ONLY
              该常量指示不可以更新的 ResultSet 对象的并发模式。CONCUR_UPDATABLE
              该常量指示可以更新的 ResultSet 对象的并发模式。FETCH_FORWARD
              该常量指示将按正向(即从第一个到最后一个)处理结果集中的行。FETCH_REVERSE
              该常量指示将按反向(即从最后一个到第一个)处理结果集中的行处理。FETCH_UNKNOWN
              该常量指示结果集中的行的处理顺序未知。HOLD_CURSORS_OVER_COMMIT
              该常量指示调用 Connection.commit 方法时不应关闭 ResultSet 对象。TYPE_FORWARD_ONLY
              该常量指示指针只能向前移动的 ResultSet 对象的类型。TYPE_SCROLL_INSENSITIVE
              该常量指示可滚动但通常不受其他的更改影响的 ResultSet 对象的类型。TYPE_SCROLL_SENSITIVE
              该常量指示可滚动并且通常受其他的更改影响的 ResultSet 对象的类型。
    -------------------------------------------------------------------------------- 
    这些常量都属于 ResultSet 类为:static int型。
    有了上面的这些基础,接下来我们就可以利用 Java 代码在 Oracle 库中记录 CLob / BLob 型数据了。
     
    首先来说明 BLob 型数据和 CLob 型数据的差别:在 Oracle 中 BLob 型的字段主要用来记录二进制数据,如:图片、媒体、音乐以及压缩文件等等等等……。而 Clob 主要用来记录大字段的文本信息。
     
    我首先想说明一下如何来写入 CLob 型数据之后说明如何往 BLob 中写值。
     
    1.为了数据量足够大,因此我生成一个大约 2.5MB 的随机字母序列用以写入数据库:
    java 代码
    char mychar='A';    
    char thechar;    
    StringBuffer strB=new StringBuffer();    
    for(int i=0;i<=100000;i++){    
        for(int j=0;j<26;j++){    
            int myRandom=(int)((100*(Math.random()))%26);    
            thechar=(char)(myRandom+mychar);    
            strB.append(thechar);    
        }    
    }    
     
    2.开始入库:
    java 代码
    public void setClob(String values) throws Exception{    
            try{    
                    conn=DBConnection.getConn();    
                    ps=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);    
                    conn.setAutoCommit(false);    
                    rs=ps.executeQuery("select clobid, mydata from myclob where clobid='1111' for update");    
                    java.sql.Clob clob=null;    
                    if(rs.next()){    
                            clob=rs.getClob("mydata");    
                            CLOB myclob=(CLOB)clob;    
                            Writer outStream=myclob.getCharacterOutputStream();    
                            char[] c=values.toCharArray();    
                            outStream.write(c,0,c.length);    
                            outStream.flush();    
                            outStream.close();    
                    }    
                    conn.commit();    
            } catch(Exception e){    
                    e.printStackTrace();    
                    conn.rollback();    
                    e.getMessage();    
                    throw new Exception(e);    
            } finally{    
                    DBConnection.close(rs);    
                    DBConnection.close(ps);    
                    DBConnection.freeConn(conn);    
            }    
    }   接下来,我对 setClob(String values) 方法开始进行分析:
     
    为了能够正确将大字段写入 Oracle 库中,在执行写入之前你还需要作一点小小的准备性工作 :
      
    java 代码
    public void clearClob()throws Exception{    
        try{    
            Connection conn=DBConnection.getConn();    
            Statement ps=conn.createStatement();    
            String updateSQL="update myclob set mydata=empty_clob() where clobid='1111'  and mydata is null";    
            ps.executeUpdate(updateSQL);    
        } catch(Exception ex){    
            ex.printStackTrace();    
            throw new Exception(ex);    
        } finally{    
            //close RS/PS/DB    
        }    
    }   因为在默认情况下 Clob 对象是 Null 型的,对一个 Null 型对象在进行操作时会抛出“空指针异常”因此,我们需要在该字段写入一个空 Clob 对象。下面我开始对数据的提交的方法进行分析说明:
      
    java 代码
    ps=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);   上面的这行代码现在应该不需要再进行详细的说明了吧。
     
    在锁定单行记录的情况下,只能采用连接(conn)提交方式而不是记录集(ps)提交方式。在默认情况下,连接提交方式被设置在了AutoCommit状态下,因此,为了能够使我们更新的数据能够在连接提交方式下进行提交,就需要将AutoCommit状态设置为 false 。
     
    剩下的问题就是“for update”关键字,通常,SELECT操作将不会对正处理的行执行任何锁定设置,这使得连接到该数据库的其他会话可以改变正在选择的数据。
    但是,结果集仍然是一致性的。当确定了活动集以后,在执行OPEN的时刻,ORACLE会截取下该表的一个快照。在此时刻以前所提交的任何更改操作都会在活动集中反映出来。在此时刻以后所进行的任何更改操作,即使已经提交了它们,都不会被反映出来,除非将该游标重新打开。但是使用 FOR UPDATE 子句,在OPEN返回以前的活动集的相应行上会加上互斥锁,这些锁会避免其他的会话对活动集中的行进行更改。直到整个事务被提交为止。因此,为了确保活动集的相应行被锁定,我们需要在 select 语句中加入 FOR UPDATE 子句。
     
    接下来就是将大字段数据入库,这里牵扯到一个输入/输出流的概念,为了保证这个主题的完整性,这个问题我不打算在这个主题中进行阐述,我会在近期单开一个主题来专门讨论有关 Java 中的 Write 和 Reader 在 I/O 处理中的应用。同时,我也会对这里的 I/O 处理问题作一个完整的解答。
     
    好了,现在我们期待已久的大字段已经被我们写入到了数据库中,那么怎么样才能把它从库中读出来并显示出来呢,接下来,我将对这个问题作一个比较完整的实现说明。
     
    以下是读取 Clob 对象的完整操作方法:
    java 代码
    public String showClob() throws Exception{    
            try{    
                    String str=null;    
                    conn=DBConnection.getConn();    
                    ps=conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);    
                    rs=ps.executeQuery("select clobid, mydata from myclob where clobid='1111' ");    
                    java.sql.Clob clob=null;    
                if(rs.next()){    
                        clob=rs.getClob("mydata");    
                        CLOB myclob=(CLOB)clob;    
                        long clen=myclob.length();    
                        char clobArray[] = new char[(int)clen];    
                        int readednum= myclob.getChars(1,(int)clen,clobArray);    
                        StringBuffer sb=new StringBuffer();    
                        sb.append(clobArray);    
                        str=sb.toString();    
                }    
                return str;    
            } catch(Exception e){    
                    e.printStackTrace();    
                    e.getMessage();    
                    throw new Exception(e);    
            } finally{    
                    //close RS/PS/DB    
            }    
    }   首先对以下两行代码进行比较:
     
    java 代码
    ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY    
    ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE   
     
    在向数据库中写入 Clob 对象时,为了我们的写入操作不受影响就需要锁定单行记录,因此使用 TYPE_SCROLL_INSENSITIVE 型 ResultSet 对象
      

  8.   


    首先,对于存储容量大于3M的XML文档,,用DOM解析,,,,,,你知道会出现什么后果!!
    至于SAX事件驱动...还可以,,,不过,本人没有用过..其他的二种也少有涉及,期待高手解答..XML文档是做数据传输用的......只是有做第一次解析的时候要用到..后面的也就相对小了!
      

  9.   

    呵呵,你说的没错,我以前用c++中sax解析15M的文件,
    占用内存的大小关键是解析后的结构树(节点对象,属性对象,值对象)的大小,而DOM是读入整个xml文件后,
    在内存中创建dom树,当然SAX是边解析边处理。
      

  10.   

    同时jdom,dom4j都是使用sax解析器来处理xml文件,创建相对应的树
      

  11.   

    public List XMLRead(Document accountProfileDoc, String desiredFieldName,
    String node, String desiredEndNode) { List list = new ArrayList();
    List alAccountProfic = null;
    ArrayList alList = new ArrayList();
    String str = null;
    if (accountProfileDoc != null) { alAccountProfic = (List) accountProfileDoc.selectNodes(node);
    }
    if (desiredFieldName != null) {
    for (int i = 0; i < alAccountProfic.size(); i++) {
    Element element = (Element) alAccountProfic.get(i);
    str = element.attribute(desiredFieldName).asXML().substring(
    desiredFieldName.length() + 1); list.add(str);
    }
    } else {
    for (int j = 0; j < alAccountProfic.size(); j++) { Element element = (Element) alAccountProfic.get(j);
    String strRequred = element.asXML();
    int indexLength = desiredEndNode.length(); String strPay = strRequred.substring(indexLength + 2,
    strRequred.length() - indexLength - 3);
    System.out.println(strPay);
    alList.add(strPay); }
    list = alList;
    }
    return list;
    }
    //从模版本文件读取 public static List getResponseListFromFile(String fileURL) throws Exception {
    List list = new ArrayList();
    ParseXMLImp parseXMLImp = new ParseXMLImp();
    Document document = parseXMLImp.getAccountProfileXML(fileURL);
            System.out.println(document.asXML());
    List integrationIdList = parseXMLImp.XMLRead(document, null, "/SiebelMessage/ListOfCtzjAssetTestIo/AssetMgmt-Asset/IntegrationId","IntegrationId");
            System.out.println(integrationIdList.size());
            if(integrationIdList.size()>0){
             for (int i = 0; i < integrationIdList.size(); i++) {
         SubProductDomain domain = new SubProductDomain();
         domain.setIntegrationId(integrationIdList.get(i).toString());
         System.out.println(domain.getIntegrationId());
         list.add(domain);
         }
            }
    return list;
    }