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:

text alt


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)));
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top