2010-11-06 2 views
1

Cette requête ne fonctionne pas comme je le souhaite. Quelqu'un voit le problème? J'essaye d'obtenir un élément par son nom, mais il ne retourne rien. Voici la partie spécifique de la fonction que j'ai besoin d'aide avec:Besoin d'aide avec une requête XElement

alt text


Mise à jour

La solution était d'utiliser un XName au lieu d'une chaîne. Comme si:

var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name))); 

Répondre

3

Essayez de changer votre ligne:

elements.Where(e => e.Name.LocalName == name) 

La partie LocalName est la partie importante, sinon vous comparez l'égalité d'un XName avec un string. Rappelez-vous, XML prend en charge les noms du style "prefix: element-name". Dans cet exemple, "prefix" est l'identifiant associé à l'espace de nom retourné par e.Name.Namespace et "element-name" est l'identifiant renvoyé par e.Name.LocalName.

+0

Intéressant - J'ai eu le sentiment que cela pourrait avoir quelque chose à voir avec l'espace de noms, je vais enquêter plus loin. Merci. –

1

Je pense que vous devez ajouter l'espace de noms racine au nom de l'élément. Vous pouvez également essayer d'utiliser la méthode XContainer.Descendants(XName) à la place.

2

Kirk's answer est juste sur l'argent. Je voulais signaler quelques problèmes avec votre code.

Cette ligne dénombre inutilement tous les éléments:

var hasMatch = matchingElements.Count() > 0; 

Vous pouvez le remplacer par Any() qui prendra fin au début une fois un élément se trouve:

var hasMatch = matchingElements.Any(); 

Ensuite, après avoir vérifié que hasMatch est true vous devriez appeler First() au lieu de FirstOrDefault() puisque vous savez qu'il doit avoir une valeur à ce moment-là.

Cela dit, vous pouvez réellement réécrire votre code comme suit:

var matchingElement = elements.FirstOrDefault(e => e.Name.LocalName == name); 
return (string)matchingElement; 

ici à un casting string renverra la valeur de l'élément si elle a été trouvé, il serait par ailleurs revenir null. La distribution est utilisée juste au cas où il était null puisque vous ne seriez pas en mesure d'utiliser matchingElement.Value qui lancerait un NullReferenceException si aucun élément n'a été trouvé. Vous devriez également envisager d'utiliser SingleOrDefault si vous pensez qu'un seul élément existe.

+0

Merci pour vos commentaires! Je n'étais pas au courant des avantages de la fonction .Any. J'ai apprécié que vous preniez le temps d'enseigner ces optimisations. –