Java DOM XML Parser - 打印的XML包含一个标记而不是多个标记

时间:2016-11-02 04:39:19

标签: java xml dom xml-parsing transformation

我已经编写了一些代码从MySQL加载记录并解析它们并保存到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 个答案:

答案 0 :(得分:1)

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

要获得预期结果,请在row循环中创建while (rs.next())元素,然后将part.appendChild(row);移动到该循环体的末尾。

CallableStatement#execute()表示结果集是否可用。 CallableStatement#getMoreResults()表示是否有其他结果集可用;除非你的语句返回多个结果集,否则调用它是没有用的(另请参阅this answer)。如果您的CallableStatement仅返回一个结果集,则可以安全地使用if代替外部while,并移除对getMoreResults()的调用。