以下是上下文:我使用HTMLAgilityPack选择P节点,如下所示:
var paragraphe = html.DocumentNode.SelectNodes(".//p[not(descendant::p)]");
然后使用for循环,我想每次测试,如果这个DOM元素的父元素是DIV并且包含特定属性,例如:div[@edth_correction='N']
但我不知道如何获取父节点,我已经为我必须完成的工作编写了所有代码。
我知道我可以做这样的事情:paragraphe[i].ParentNode.Attributes.Equals()
但是我不知道在这个Equals中写什么,如果这是我必须用于我的情况。
答案 0 :(得分:2)
试试这种方式
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']]"