Получить значение атрибута LINQ

Вопрос:

Источник HTML выглядит следующим образом

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

Я использую следующий запрос LINQ для получения значения 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();

Но imageURL дает результат как

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

Лучший ответ:

Проблема заключается в том, чтобы передать его в строку. Select() возвращает IEnumerable<T> поэтому вы в основном конвертируете перечислитель в строку (как говорится в сообщении об ошибке). Вызовите First() или Single() или Take(1), чтобы получить один элемент перед тем, как передать его в строку.

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

Кроме того, если есть вероятность, что нужный элемент отсутствует, FirstOrDefault() и SingleOrDefault() возвращает значение null, а затем выбрасывает исключение. В этом случае я бы рекомендовал

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

Ответ №1

Добавить.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();

Ответ №2

Попробуйте добавить FirstOrDefault():

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

Оцените статью
TechArks.Ru
Добавить комментарий