Ottieni il valore dell'attributo tramite LINQ

getelementbyid html-agility-pack linq

Domanda

La sorgente HTML è la seguente

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

Sto usando la seguente query LINQ per ottenere il valore SRC (Link immagine)

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

Ma imageURL fornisce output come

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

Risposta accettata

Il problema è lanciarlo alla stringa. Select() restituisce IEnumerable<T> quindi in pratica stai convertendo un enumeratore in una stringa (come dice il messaggio di errore). Chiama First() o Single() o Take(1) per ottenere un singolo elemento prima di inviarlo a una stringa.

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

Inoltre, se esiste la possibilità che l'elemento desiderato non sia presente, FirstOrDefault() e SingleOrDefault() restituiscono null invece di SingleOrDefault() un'eccezione. In tal caso, lo raccomanderei

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

Risposta popolare

Aggiungi .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

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché