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']]"


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因