2016-11-02 3 views
0

Я написал несколько файлов для загрузки кода из MySQL и разбора их и сохранения в файл XML. То, что я хотел достичь было что-нибудь вроде этого:Java DOM XML Parser - печатный 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

Вы создаете элемент row только один раз, перед повторением всех строк в ResultSet.

Чтобы получить ожидаемый результат, создайте элемент row внутри цикла while (rs.next()) и переместите part.appendChild(row); в конец корпуса этого контура.

CallableStatement#execute() указывает, доступен ли набор результатов. CallableStatement#getMoreResults() указывает, доступен ли другой набор результатов; нет смысла использовать его, если ваш оператор не возвращает несколько наборов результатов (см. также this answer). Если ваш CallableStatement возвращает только один результирующий набор, вы можете безопасно использовать if вместо внешнего while и удалить звонок getMoreResults().