Как вернуть нумерацию в C#?

120
01 декабря 2020, 00:40

Есть такая разметка:

<html>
...
<div class="shop-name">rand</div>
...
<div class="shop-name">rand</div>
...
<div class="shop-name">this</div>
...
<div class="shop-name">rand</div>
...
</html>

Как вернуть число 3?
"this" в разметке идет под номером 3.

Спасибо.

Answer 1

Обязательно познакомьтесь с библиотекой HtmlAgilityPack!

Вот пример, который решает Вашу проблему:

public static int GetShopIndex(string HTML, string ShopName)
{
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(HTML);
    return doc.DocumentNode
        .SelectNodes("//html//div[@class='shop-name']")? // Выбираем интересующие нас узлы по xpath
        .Select((x, i) => new { Text = x.InnerText, Index = i }) // Комбинируем внутренний текст и номер узла
        .FirstOrDefault(x => x.Text == ShopName)?.Index ?? -1;  // Возвращаем индекс узла, текст которого равен заданному
                                                                // Если такого нет - возвращаем -1
}

Использование:

int i = GetShopIndex("<html><div class='shop-name'>rand</div><div class='shop-name'>this</div></html>", "this");
//i == 1

Если отсчет с 0 Вас по каким-то причинам не устраивает, просто добавьте единичку)

Answer 2

Дополненю @Kir_Antipov могу дать ответ на альтернативной библиотеке парсинга — AngleSharp:

var html = @"<html>
        <div class=""shop-name"">rand</div>
        <div class=""shop-name"">rand</div>
        <div class=""shop-name"">this</div>
        <div class=""shop-name"">rand</div>
    </html>";
var parser = new HtmlParser();
var document = parser.ParseDocument(html);
var elements = document.QuerySelectorAll("div.shop-name").Select(x => x.TextContent).ToArray();
// выводим все
foreach (var element in elements)
{
    Console.WriteLine($"{element}");
}
// выводим третий элемент
Console.WriteLine($"Третий элемент: {elements[3]}");

Ссылки по теме:

  • Как правильно парсить с помощью AngleSharp?
  • AngleSharp.Samples

Нумерация если нужна, то linq такое же:

Select((x, i) => new { Index = i, Text = x.TextContent })

READ ALSO
Как получить выбраный элемент в ComboBox?

Как получить выбраный элемент в ComboBox?

Как в ViewModel получить то, что выбрал юзер в ComboBox? Я не мог найти как это сделать, если я заполняю список внутри XAML, а не из кода

100
PHP array_walk и array_filter

PHP array_walk и array_filter

Выдает вот это: Strict Standards: Only variables should be passed by reference on line 13 Не могу понять где константаpostfix не добавляется

107
Документация проекта/проектов + связи

Документация проекта/проектов + связи

Есть несколько проектов, взаимодействующих друг с другом по http api или console api или еще как-нибудь

111