2010-06-15 3 views
0

J'ai une méthode en C# qui trouve un nœud avec le nom node_name dans la liste de nœuds arg, et renvoie la valeur du nœud trouvé (en supposant qu'il n'y ait qu'un seul nœud avec un tel prénom). Si aucun de ces nœuds n'est trouvé, il doit renvoyer une chaîne vide.Impossible d'obtenir une valeur de retour d'une boucle foreach à l'intérieur d'une méthode

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

Le code ci-dessus renvoie toujours une chaîne vide. Qu'est-ce qui me manque ici?

+0

Avez-vous besoin d'une recherche insensible à la casse? Essayez d'utiliser la fonction de comparaison avec l'ignorecase enum. – apoorv020

+0

Vous voudrez peut-être consulter Linq-to-SQL. Vous pouvez le faire en tant que requête Linq. Après je suis passé à cela, je veux pleurer chaque fois que je vois quelqu'un en utilisant l'ancien modèle d'objet. – juharr

Répondre

1

Quelle que soit l'appel récursif trouve votre noeud retournera, mais à moins que c'est le plus haut niveau que la valeur se juste ignorée. Vous avez sans doute l'intention de faire quelque chose comme:

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

Eh bien, vous ignorez la valeur de retour de l'appel récursif dans le bloc else. Vouliez-vous revenir de là dans certains cas? Je suppose que vous voulez quelque chose comme ça (fixation quelques bizarreries de la convention en même temps):

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

Je pense que vous avez un bug lorsque le nœud que vous recherchez est une feuille. Vous retournerez toujours une chaîne vide. –

+0

@Petar: Je suppose que l'idée est de rechercher des nœuds * text * dans les * éléments * du nom donné. Je vais juste sur ce que le code original fait bien. –

+0

Merci pour une réponse rapide :) C'est ce qui m'a manqué. –

0

La meilleure façon de le savoir serait de parcourir le code lors de la configuration « montres » sur arg_node.ParentNode.Name et node_name et vous verrez quelles branches ça va finissent dans et vous pouvez découvrir pourquoi il n'est pas allé là où vous pensiez que cela irait.

Questions connexes