2014-10-29 57 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);