2010-06-15 94 views
0

我在C#中有一个方法,在节点列表arg中找到名称为node_name的节点,并返回找到的节点的值(假设只有一个节点具有此类节点)名称)。如果找不到这样的节点,它应该返回一个空字符串。无法从方法内的foreach循环获取返回值

public string get_nodes_value(XmlNodeList arg, string node_name) 
{ 
    foreach (XmlNode arg_node in arg) 
    { 
     if (!arg_node.HasChildNodes) 
     { 
      if (String.Compare(arg_node.ParentNode.Name, node_name) == 0) 
      { 
       return arg_node.Value; 
      } 
     } 
     else 
     { 
      get_nodes_value(arg_node.ChildNodes, node_name); 
     } 
    } 
    return ""; 
} 

上面的代码总是返回一个空字符串。我在这里错过了什么?

+0

也许你需要不区分大小写的搜索?尝试使用ignorecase枚举的compare函数。 – apoorv020 2010-06-15 12:04:03

+0

您可能想要查看Linq-to-SQL。您可以将其作为一个Linq查询来完成。当我切换到它后,每当看到有人使用旧的对象模型时,我都会哭泣。 – juharr 2010-06-15 12:32:57

回答

1

无论递归调用就会发现你的节点会返回,但除非它是顶级该值只是被忽略。你可能打算这样做:

else 
    { 
     string value = get_nodes_value(arg_node.ChildNodes, node_name); 
     if (value != "") 
      return value; 
    } 
3

那么,你忽略了else块中的递归调用的返回值。你有意在某些情况下从那里返回吗?我的猜测是,你想是这样的(在同一时间固定的几个约定古怪):

public string GetNodeValue(XmlNodeList list, string name) 
{ 
    foreach (XmlNode node in list) 
    { 
     if (!node.HasChildNodes) 
     { 
      if (node.ParentNode.Name == name) 
      { 
       return arg_node.Value; 
      } 
     } 
     else 
     { 
      // Only return if we've found something within this node's child list 
      string childValue = GetNodeValue(node.ChildNodes, name); 
      if (childValue != "") 
      { 
       return childValue; 
      } 
     } 
    } 
    return ""; 
} 
+0

我认为当你搜索的节点是叶时,你有一个bug。你将永远返回一个空字符串。 – 2010-06-15 11:59:40

+0

@Petar:我假设这个想法是在给定名称的* elements *内搜索* text *节点。我只是继续进行原始代码的工作。 – 2010-06-15 12:02:18

+0

谢谢你的回复:) 这就是我错过的。 – 2010-06-15 12:09:33

0

最简单的方法找到了将单步执行代码,同时设立“手表”上arg_node.ParentNode.Namenode_name,然后你会看到它的分支,它会最终进入,你可以找出为什么它没有去你认为它会去的地方。