无法从try-catch嵌套for循环中提取String

时间:2014-08-31 14:51:58

标签: java string xml-parsing try-catch nodes

我正在解析XML文件以获取子节点,这确实有效。我只是想将它放入一个String并将其传递出for循环但是当我将它传递出去时,它不会将所有子节点都放入String中,有时它不会在String中放入任何内容。如果它在if语句下使用System.out.println(data),那么它可以正常工作。我想从if循环中获取数据并传递它。这是我的代码......

public class Four {

    public static void main(String[] args) {

        Four four = new Four();
        String a = null;
        try {
            Document doc = four.doIt();
            String b = four.getString(doc);

            System.out.println(b);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public Document doIt() throws IOException, SAXException, ParserConfigurationException {
        String rawData = null;

        URL url = new URL("http://feeds.cdnak.neulion.com/fs/nhl/mobile/feeds/data/20140401.xml");
        URLConnection connection = url.openConnection();
        InputStream is = connection.getInputStream();
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);

        return doc;
    }

    public String getString(Document doc) {
        String data = null;

        NodeList cd = doc.getDocumentElement().getElementsByTagName("game");
        for (int i = 0; i < cd.getLength(); i++) {
          Node item = cd.item(i);
          System.out.println("==== " + item.getNodeName() + " ====");
          NodeList children = item.getChildNodes();
          for (int j = 0; j < children.getLength(); j++) {
            Node child = children.item(j);


            if (child.getNodeType() != Node.TEXT_NODE) {
                data = child.getNodeName().toString() + ":" + child.getTextContent().toString();    
                // if I System.out.println(data) here, it shows all everything
                I want, when I return data it shows nothing but ===game===
            }
        }
        }
        return data;
    }
}

2 个答案:

答案 0 :(得分:1)

我没有看到try语句与循环结合产生的任何问题。但是,我不确定你的getString函数是否像你想象的那样工作。仔细查看分配数据的语句:

data = child.getNodeName().toString() + ":" + child.getTextContent().toString();    

对于循环中的每次迭代,都会完全重新分配数据变量。您的返回值仅包含已处理的最后一个节点的数据。

我认为您可能要做的是将节点的值连接到字符串的末尾。你可以这样写:

data += "|" + child.getNodeName().toString() + ":" + child.getTextContent().toString();

答案 1 :(得分:0)

您应该在b块之外定义try

    String b = null;
    try {
        Document doc = four.doIt();
        b = four.getString(doc);

        System.out.println(b);
    } catch (Exception e) {
        e.printStackTrace();
    }

这将允许您在try块之外使用其值。