2010-06-15 2 views
0

У меня есть метод на C#, который находит узел с именем node_name в списке узлов arg и возвращает значение найденного узла (при условии, что существует только один узел с такими имя). Если таких узлов не найдено, он должен вернуть пустую строку.Не удается получить возвращаемое значение из цикла 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. – apoorv020

+0

Возможно, вы захотите проверить Linq-to-SQL. Вы можете сделать это как один запрос Linq. После того, как я переключился на него, я хочу плакать, когда вижу кого-то, кто использует старую объектную модель. – juharr

ответ

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

Я думаю, что у вас есть ошибка, когда узел, который вы ищете, является листом. Вы всегда будете возвращать пустую строку. –

+0

@Petar: Я предполагаю, что идея состоит в поиске * текстовых * узлов внутри * элементов * данного имени. Я просто продолжаю то, что делает оригинальный код. –

+0

Спасибо за быстрый ответ :) Вот что я пропустил. –

0

Самый простой способ узнать это было бы пройти через код, при настройке «часы» на arg_node.ParentNode.Name и node_name, и тогда вы увидите, какие ветви он будет в конце концов, и вы можете узнать, почему он не пошел туда, где вы думали, что он пойдет.

Смежные вопросы