2016-11-02 65 views
0

我已經編寫了一些來自MySQL的代碼加載記錄並解析它們並保存到XML文件中。我想實現是事端這樣的:Java DOM XML解析器 - 打印的XML包含一個標記而不是多個標記

<part><row>.....</row><row>...</row></part> 

現在我有:

<part><row>...</row></part> 

這裏的屏幕顯示我的poroblem:

enter image description here

這裏是Java代碼部分,其將數據解析爲XML Document結構:

private void callSPInParOrWithout(final Document doc, 
      final Connection conn) { 
     ResultSet rs = null; 
     CallableStatement cs = null; 
     try { 
      // <part> 
      Element part = doc.createElement("part"); 
      doc.appendChild(part); 

      cs = conn.prepareCall("{CALL getBrandRows(?)}"); 
      cs.setString(1, "Brand#13"); 

      boolean results = cs.execute(); 
      while (results) { 
       // <row> 
       Element row = doc.createElement("row"); 
       part.appendChild(row); 
       rs = cs.getResultSet(); 
       while (rs.next()) { 
        // <p_partkey> 
        Element pPartKey = doc.createElement("p_partkey"); 
        pPartKey.appendChild(doc.createTextNode(Integer.toString(
          rs.getInt("p_partkey")))); 
        row.appendChild(pPartKey); 
        // <p_name> 
        Element pName = doc.createElement("p_name"); 
        pName.appendChild(doc.createTextNode(rs.getString(
          "p_name"))); 
        row.appendChild(pName); 
        // <p_mfgr> 
        Element pMfgr = doc.createElement("p_mfgr"); 
        pMfgr.appendChild(doc.createTextNode(rs.getString(
          "p_mfgr"))); 
        row.appendChild(pMfgr); 
        // <p_brand> 
        Element pBrand = doc.createElement("p_brand"); 
        pBrand.appendChild(doc.createTextNode(rs.getString(
          "p_brand"))); 
        row.appendChild(pBrand); 
        // <p_type> 
        Element pType = doc.createElement("p_type"); 
        pType.appendChild(doc.createTextNode(rs.getString(
          "p_type"))); 
        row.appendChild(pType); 
        // <p_size> 
        Element pSize = doc.createElement("p_size"); 
        pSize.appendChild(doc.createTextNode(Integer.toString(
          rs.getInt("p_size")))); 
        row.appendChild(pSize); 
        // <p_container> 
        Element pContainer = doc.createElement("p_container"); 
        pContainer.appendChild(doc.createTextNode(rs.getString(
          "p_container"))); 
        row.appendChild(pContainer); 
        // <p_retailprice> 
        Element pRetailPrice = doc.createElement("p_retailprice"); 
        pRetailPrice.appendChild(doc.createTextNode(
          Float.toString(rs.getFloat("p_retailprice")))); 
        // <p_comment> 
        Element pComment = doc.createElement("p_comment"); 
        pComment.appendChild(doc.createTextNode(rs.getString(
          "p_comment"))); 
        row.appendChild(pComment); 
       } 
       results = cs.getMoreResults(); 
      } 
     } catch (SQLException e) { 
      JOptionPane.showMessageDialog(null, e.getMessage(), 
        "Exception occured", JOptionPane.ERROR_MESSAGE); 
     } finally { 
      try { 
       if (rs != null) rs.close(); 
       if (cs != null) cs.close(); 
      } catch (SQLException e) { 
      } 
     } 
    } 

正如您在屏幕截圖中看到的,它運行良好,但我在創建<row>標記時犯了一些錯誤。

回答

1

在迭代ResultSet中的所有行之前,您只創建row元素一次。

要獲得預期結果,請在while (rs.next())循環內創建row元素,並將​​移動到該循環體的末尾。

CallableStatement#execute()指示結果集是否可用。 CallableStatement#getMoreResults()指示是否有其他結果集可用;在調用它時沒有用處,除非您的語句返回多個結果集(另請參見this answer)。如果您的CallableStatement只返回一個結果集,則可以安全使用if代替外部while,並刪除對getMoreResults()的呼叫。