Vous avez besoin d'aide avec un XElement Recherche
Question
Cette requête ne fonctionne pas comme je me attends à. Quelqu'un voit-il le problème?
Je suis en train d'obtenir un élément par son nom, mais il ne rien retourner. Voici la partie spécifique de la fonction que j'ai besoin d'aide avec:
Mise à jour
La solution était d'utiliser un XName au lieu d'une chaîne. Comme ceci:
var matchingElements = elements.Where(e => e.Name.Equals(XName.Get(name)));
La solution
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, prend en charge XML noms du style "préfixe: element-name". Dans cet exemple, est l'identifiant « préfixe » est l'identifiant associé à l'espace de noms retourné par e.Name.Namespace
et « nom d'élément » retourné par e.Name.LocalName
.
Autres conseils
Kirk réponse est juste sur l'argent . Je voulais signaler quelques problèmes avec votre code.
Cette ligne compte 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 devez appeler First()
au lieu de FirstOrDefault()
puisque vous savez qu'il doit avoir une valeur à ce moment-là.
Cela dit, vous pouvez effectivement réécrire votre code comme suit:
var matchingElement = elements.FirstOrDefault(e => e.Name.LocalName == name);
return (string)matchingElement;
Castings ici à un string
renverra la valeur de l'élément si elle a été trouvé, il serait par ailleurs revenir null
. Le casting est utilisé au cas où il était null
puisque vous ne seriez pas en mesure d'utiliser matchingElement.Value
qui jetterait un NullReferenceException
si aucun élément n'a été trouvé. Vous devriez également envisager d'utiliser SingleOrDefault
si vous attendez un seul élément d'exister.
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.