HTMLAgilitypack test la valeur de l'attribut de noeud parent

c# html-agility-pack

Question

Voici ce que le contexte: J'utilise HTMLAgilityPack pour sélectionner le nœud P comme ceci:

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

Puis, en utilisant une boucle for, je veux tester chaque fois si le parent de cet élément DOM est un DIV et contient un attribut spécifique tel que: div[@edth_correction='N']

Mais je ne sais pas comment obtenir le nœud parent, j'ai déjà écrit tout le code du travail que je dois faire.

Je sais que je peux faire quelque chose comme ceci: paragraphe[i].ParentNode.Attributes.Equals() mais je ne sais pas quoi écrire dans cet égal et si c'est ce que je dois utiliser pour mon cas.

Réponse acceptée

Essayez de cette façon

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
    }
}

Une autre façon: vérifiez le nœud parent et attribuez avec XPath.

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

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

Pour tester les ancêtres des nœuds, essayez ceci

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
        }
    }
}

Ou avec XPath

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

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

Je ne suis pas sûr de la deuxième approche. Depuis que je ne connais pas votre source de données.

Aussi, vous pouvez essayer XPath

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi