SelectNodes с использованием определенного класса и атрибута, установленного на определенное значение - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий код, чтобы найти некоторые элементы в моем HTML и сделать что-то с теми, которые имеют определенный атрибут:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlString);

foreach (HtmlNode div in doc.DocumentNode.SelectNodes("//div[contains(@class,'item')]"))
{
    var hasAttachments = div.Attributes.FirstOrDefault(a => a.Name.Equals("hasattachments"));
    if (hasAttachments.Value.Equals("True"))
    {
        var itemId = div.Attributes.FirstOrDefault(a => a.Name.Equals("itemid")).Value;
        doStuffWithItemId(itemId);
    }
}

Мне было интересно, смогу ли я объединить свой запрос, чтобы найти элементы, которые обладаютclass и значение атрибута, установленное на "True", что-то вроде этого:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlString);

foreach (HtmlNode div in doc.DocumentNode.SelectNodes("//div[contains(@class,'item')] and //div[@data-hasattachments=\"True\"]"))
{
    var itemId = div.Attributes.FirstOrDefault(a => a.Name.Equals("itemid")).Value;
    doStuffWithItemId(itemId);
}

1 Ответ

0 голосов
/ 12 октября 2018

Это на самом деле не проблема HAP, а проблема xPath.Вы даже можете легко протестировать xPath в инструментах Chrome Dev.Также вы были на правильном пути, просто нужно положить и еще один слой.Я попробовал это с некоторыми фиктивными данными, и это сработало для меня.

//div[contains(@class,'item') and @data-hasattachments="True"]

Вот соответствующий пост SO. XPath с несколькими условиями

...