2014-10-29 56 views
0

刚刚得到了一个关于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”东西,但从来没有到达那里的回报?! 如果我想让nodeValue填充“else”语句中的值,那么需要更改哪些内容?

编辑:

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

我有一个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>的id-value从<actor>保存到一个变量中(之后该方法应该以类似于break;的方式终止,因为我不想获取所有的ID,只需要这个单一的ID。

+5

if'System.out。println(“YESSA:”+ nodeValue);'然后执行'return'2:“+ nodeValue;'也被执行... – assylias 2014-10-29 14:47:31

+0

情况并非如此。 'System.out.println'被执行,但唯一被执行的返回是最后一个不包含'return 2:“+ nodeValue'的函数,最后这个方法返回一个空的值: -/ – 2014-10-29 14:50:49

+0

你从未在'if'情况下使用'searchNode'的返回值... – l4mpi 2014-10-29 14:52:07

回答

2

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

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

或 的nodeValue = searchNode(childrens.item(i)中,节点,nodeResult);

+0

这是错误的 - 它永远不会搜索过去的第一个孩子,检查第一个分支 – dasblinkenlight 2014-10-29 14:53:39

+0

这是一个很好的建议,但是你提到的这个方法返回了**最后一个**节点的值,我的问题是我必须从被称为“nodeResult”的节点获取值。 - 在大多数情况下,从xml文档 - 这不是最后一个节点。: -/ – 2014-10-29 15:23:26

+0

对不起,因为dasblinkenlight表示它返回第一个。我的错。 – 2014-10-29 17:23:14

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; 
    } 
} 
0

您递归调用的方法,并且每次调用创建自己nodeValue堆栈。试想一下:

  • 第一你有一个孩子节点调用它,nodeValue是空字符串
  • 然后,在第一for循环再次调用相同的方法,新的nodeValue堆栈
  • 上创建
  • 返回2: something从中
  • 你什么都不做与返回结果,只是在原来的调用返回空字符串

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

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