Obtenir la valeur d'attribut par LINQ

getelementbyid html-agility-pack linq

Question

La source HTML est la suivante

<img id="itemImage" src="https://www.xyz.com/item1.jpg">

J'utilise la requête LINQ suivante pour obtenir la valeur SRC (Image Link)

string imageURL = document.DocumentNode.Descendants("img")
                    .Where(node => node.Attributes["id"] != null && node.Attributes["id"].Value == "itemImage")
                    .Select(node => node.Attributes["src"].Value).ToString();

Mais l’imageURL donne comme résultat

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[HtmlAgilityPack.HtmlNode,System.String]

Réponse acceptée

Le problème est de le lancer en string. Select() renvoie IEnumerable<T> ce qui IEnumerable<T> que vous convertissez un énumérateur en chaîne (comme l'indique le message d'erreur). Appelez First() ou Single() ou Take(1) pour obtenir un seul élément avant de le convertir en chaîne.

.Select(node => node.Attributes["src"].Value).First().ToString();

De même, s'il est possible que l'élément souhaité ne soit pas présent, FirstOrDefault() et SingleOrDefault() renvoient null plutôt que de lancer une exception. Dans ce cas, je recommanderais

var imageUlr = ... .Select(node => node.Attributes["src"].Value).FirstOrDefault();
if (imageUrl != null)
{
    // cast it to string and do something with it
}

Réponse populaire

Ajouter .DefaultIfEmpty (string.Empty) .FirstOrDefault

string imageURL = document.DocumentNode.Descendants("img")
                .Where(node => node.Attributes["id"] != null && node.Attributes["id"].Value == "itemImage")
                .Select(node => node.Attributes["src"].Value)
                .DefaultIfEmpty(string.Empty)
                .FirstOrDefault()
                .ToString();


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow