无法回复的退货声明?

时间:2014-10-29 14:45:48

标签: java xml recursion

刚刚得到一个关于Java中的return语句的问题以及一个应该在xml语句中从深层返回值的方法的使用。

public static String searchNode(Node node, Node parent, String nodeResult) {
    String nodeValue = "";

    if (node.hasChildNodes()) {
        NodeList childrens = node.getChildNodes();
        for (int i = 0; i < childrens.getLength(); i++) {
            searchNode(childrens.item(i), node, nodeResult);
        }
    } else {
        nodeValue = node.getNodeValue().trim();
        if (nodeValue.length() > 0) {
            if (parent.getNodeName().equals(nodeResult)) {
                System.out.println("YESSA: " + nodeValue);
                return "2: " + nodeValue;
            }
        }
    }
    return nodeValue;
}

这是我的问题:为什么返回“2” - 声明从未到达?或者让我更加问:为什么最后的nodeValue仍然是空的?我已经测试了它并且代码打印了这个“System.out.println”-thing,但是从来没有到达那里的回归?! 如果我希望nodeValue填充“else”-statement中的值,我该怎么办?

编辑:

好的,我尝试了你提出的建议,但不幸的是我从来没有得到我想要的结果。 进一步说明:

我有一个xml结构,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<log>
<published>2014-03-28T15:28:36.646Z</published>
<actor>
    <objectType>person</objectType>
    <id>e1b8948f-321e-78ca-d883-80500aae71b5</id>
    <displayName>anonymized</displayName>
</actor>
<verb>update</verb>
<object>
    <objectType>concept</objectType>
    <id>a1ad6ace-c722-ffa9-f58e-b4169acdb4e3</id>
    <content>time</content>
</object>
<target>
    <objectType>conceptMap</objectType>
    <id>4b8f69e3-2914-3a1a-454e-f4c157734bd1</id>
    <displayName>my first concept map</displayName>
</target>
<generator>
    <objectType>application</objectType>
    <url>http://www.golabz.eu/content/go-lab-concept-mapper</url>
    <id>c9933ad6-dd4a-6f71-ce84-fb1676ea3aac</id>
    <displayName>ut.tools.conceptmapper</displayName>
</generator>
<provider>
    <objectType>ils</objectType>
    <url>http://graasp.epfl.ch/metawidget/1/b387b6f</url>
    <id>10548c30-72bd-0bb3-33d1-9c748266de45</id>
    <displayName>unnamed ils</displayName>
</provider>
</log>

我按照以下方式显示方法调用:

searchNode(document.getFirstChild(), null, "id")

然后,我想在<id>中将子节点<actor>的id值保存在一个变量中(之后该方法应该以类似break;的方式终止,因为我不知道我想获得所有的ID。只需要这个ID。

3 个答案:

答案 0 :(得分:2)

您不会返回递归的结果。你应该退还它,或者设置结果。

return searchNode(childrens.item(i), node, nodeResult);

或     nodeValue = searchNode(childrens.item(i),node,nodeResult);

答案 1 :(得分:1)

您编写了一个忽略中间调用结果的递归方法。只有在您要查找的节点处开始搜索时,才会到达有问题的返回语句。

要解决此问题,您的递归分支应该注意递归调用返回的内容。如果您需要找到第一个匹配的孩子,请执行以下操作:

for (int i = 0; i < childrens.getLength(); i++) {
    String tmp = searchNode(childrens.item(i), node, nodeResult);
    if (tmp != null && tmp.length() != 0) {
        return tmp;
    }
}

答案 2 :(得分:0)

您正在以递归方式调用该方法,并且每个调用都会在堆栈上创建自己的nodeValue。考虑一下:

  • 首先使用具有一个子节点的节点调用它,nodeValue为空字符串
  • 然后,在第一个for循环中,您再次调用相同的方法,在堆栈上创建新的nodeValue
  • 您从中返回2: something
  • 您对该返回结果不执行任何操作,只需在原始调用中返回空字符串

现在,您可能希望使用递归调用的结果,因此请在for循环中尝试此操作

nodeValue = searchNode(childrens.item(i), node, nodeResult);