选择下一个节点html Agility pack C#

c# filtering html-agility-pack regex

我是第一次使用htmlagilitypack的学生。我目前正在过滤html以获取值

foreach (HtmlNode link in bodyNode.SelectNodes("//span[@class='content-b']"))
{
    if (link.InnerText.Contains("Name"))
    {
        //MessageBox.Show("Found");
        textBox1.Text += "Name : " + ?????;
    }

    textBox1.Text += link.InnerText;
}

正如您所看到的,我正在检查当前节点是否包含值“NAME”,如果是,我想在其旁边获取下一个节点的值。如果你能帮我解决这个问题,我将非常感激。

名称的值在下一个节点<div class='content-b'>THIS IS MY NAME</div> ..我怎么能有问题地告诉C#在再次循环之前获得下一个节点?

谢谢。


更新:这是我正在使用的html代码片段,它看起来很难看,对不起,我无法帮助它

foreach (HtmlNode link in bodyNode.SelectNodes("//span[@class='content-b']"))
{
    if (link.InnerText.Contains("Name"))
    {
        //MessageBox.Show("Found");
        textBox1.Text += "Name : " + ?????;
    }

    textBox1.Text += link.InnerText;
}

谢谢。

一般承认的答案

首先,您的文档中没有class="content-b" 。它们都拼写为contet-b

其次,由于html格式不正确, NextSibling将无法正常工作。您需要手动获取符合条件的下一个节点。在这种情况下,您不能使用foreach循环。

结果如下:

var nodes = bodyNode.SelectNodes("//div[@class='contet-b']").ToList();
for( int i =0; i < nodes.Count; i++)
{
    var link = nodes[i];
    if (link.InnerText.Contains("Name"))
    {
        textBox1.Text += "Name : ";
        if (i + 1 < nodes.Count)
        {
            // append the value of next matching `div` node
            textBox1.Text += nodes[i + 1].InnerText.Trim();
            i++; // skip this node
        }
    }
}

热门答案

您正在寻找的是节点的NextSibling属性。在你的例子中:

foreach (HtmlNode link in bodyNode.SelectNodes("//div[@class='content-b']"))
{
    if (link.InnerText.Contains("Name"))
    {
        //MessageBox.Show("Found");
        textBox1.Text += "Name : " + link.NextSibling.InnerText;
    }

    textBox1.Text += link.InnerText;
}



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