我在C#中有一个方法,它在节点列表node_name
中找到一个名为arg
的节点,并返回找到的节点的值(假设只有一个节点具有这样的名称)。如果没有找到这样的节点,它应该返回一个空字符串。
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 :(得分: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 "";
}
答案 1 :(得分:1)
无论哪个递归调用都会找到您的节点将返回它,但除非它是顶层,否则该值将被忽略。你可能想做的事情如下:
else
{
string value = get_nodes_value(arg_node.ChildNodes, node_name);
if (value != "")
return value;
}
答案 2 :(得分:0)
找出答案的最简单方法是在arg_node.ParentNode.Name
和node_name
设置“监视”时逐步执行代码,然后您将看到它最终会进入哪个分支你可以找出它为什么不去你想象的地方。