Значение атрибута родительского узла HTMLAgilitypack

c# html-agility-pack

Вопрос

Вот что такое контекст: я использую HTMLAgilityPack для выбора P-узла следующим образом:

var paragraphe = html.DocumentNode.SelectNodes(".//p[not(descendant::p)]");

Затем, используя цикл for, мне нравится тестировать каждый раз, если родительский элемент этого DOM является DIV и содержит определенный атрибут, такой как: div[@edth_correction='N']

Но я понятия не имею, как получить родительский узел, я уже написал весь код для работы, которую я должен сделать.

Я знаю, что могу сделать что-то вроде этого: paragraphe[i].ParentNode.Attributes.Equals() но я понятия не имею, что писать в этом Equals, и если это то, что я должен использовать для своего дела.

Принятый ответ

Попробуйте этот путь

var paragraphe = html.DocumentNode.SelectNodes(".//p[not(descendant::p)]");

for (int i = 0; i < paragraphe.Count; i++)
{
    var parent = paragraphe[i].ParentNode;

    if (parent.Name == "div" &&
        parent.ChildAttributes("edth_correction").Any(a => a.Value == "N"))
    {
        // do work
    }
}

Другой способ: проверить родительский узел и атрибут с помощью XPath.

var paras = html.DocumentNode.SelectNodes(
    "//p[not(descendant::p) and name(..)='div' and ../@edth_correction='N']");

foreach (var p in paras)
{
    // do work
}

Чтобы проверить предков узлов, попробуйте это

var paragraphe = html.DocumentNode.SelectNodes(".//p[not(descendant::p)]");

for (int i = 0; i < paragraphe.Count; i++)
{
    foreach (var ancestor in paragraphe[i].Ancestors("div"))
    {
        if (ancestor.ChildAttributes("edth_correction").Any(a => a.Value == "N"))
        {
            // do work
        }
    }
}

Или с XPath

var paras = html.DocumentNode.SelectNodes(
    "//p[not(descendant::p) and ancestor::div/@edth_correction='N']");

foreach (var p in paras)
{
    // do work
}

Я не уверен в отношении второго подхода. Поскольку я не знаю ваш источник данных.

Также вы можете попробовать XPath

"//p[not(descendant::p) and ancestor::*[name(.)='div' and ./@edth_correction='N']]"


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow