0

当我试图从我的 xpath 中删除一个子节点时,我遇到了一个奇怪的错误:-

System.ArgumentOutOfRangeException 未处理 Message=Node "" is not found in the collection

我知道 HAP childremoving 存在问题,但如果他们用新版本修复它,我知道。我的问题是我的代码错误还是 HAP?无论哪种方式,有没有办法解决这个问题并删除那些子节点?

这是我的代码:-

        List<MediNetScheme> medinetScheme = new List<MediNetScheme>();
        HtmlDocument htdoc = new HtmlDocument();
        htdoc.LoadHtml(results);
        foreach (HtmlNode table in htdoc.DocumentNode.SelectNodes("//table[@class='list-medium']/tbody[1]/tr[@class]"))
        {
            string itemValue = string.Empty;
            HtmlNode ansvarig =table.SelectSingleNode("//table[@class='list-medium']/tbody[1]/tr[@class]/td[4]");
            table.RemoveChild(ansvarig, true);
            itemValue = table.InnerText;
            medinetScheme.Add(new MediNetScheme(){Datum=itemValue.Remove(15),Sections=itemValue.Remove(0,15)});
        }
        MediNetScheme.ItemsSource = medinetScheme;

编辑:-

我的 HTML 文档有一个表格,其中包含几行具有此 xpath 的表格:-“//table[@class='list-medium']/tbody 1 /tr[@class]”。此表中的每一行有 5 列 td 1 ...td[5]。在我的第一个 foreach 循环中,我使用 selectnodes 来获取表中每一行的 HTMLcode。我想要做的是只从每行的前 3 个 td 中获取内部文本,这意味着我需要从每行中删除 td[4] 和 td[5]。当我使用您编辑的代码时,我能够摆脱第一行中的 td[4] 和 td[5] 而不是第一行之后的其他行。

这是我的 HTML 的图片:- 在此处输入图像描述

4

2 回答 2

1

从其父节点中删除节点的更好方法HtmlAgilityPack是:

nodeToRemove.ParentNode.RemoveChild(nodeToRemove);

在您的代码中,您可以像这样使用:

List<MediNetScheme> medinetScheme = new List<MediNetScheme>();
HtmlDocument htdoc = new HtmlDocument();
htdoc.LoadHtml(results);
foreach (HtmlNode table in htdoc.DocumentNode.SelectNodes("//table[@class='list-medium']/tbody[1]/tr[@class]"))
{
    string itemValue = string.Empty;
    HtmlNode ansvarig =table.SelectSingleNode("//table[@class='list-medium']/tbody[1]/tr[@class]/td[4]");
    ansvarig.ParentNode.RemoveChild(ansvarig);
    itemValue = table.InnerText;
    medinetScheme.Add(new MediNetScheme(){Datum=itemValue.Remove(15),Sections=itemValue.Remove(0,15)});
 }
 MediNetScheme.ItemsSource = medinetScheme;

我希望这对你有用:)

编辑:你想获得每行前三个 td 的 InnerText。我正在检查您的代码,我认为 foreach 中的 xpath 是错误的。

我会像这样使用 linq 更改经典计数循环的 xpath:

foreach (HtmlNode trNodes in htdoc.DocumentNode.SelectNodes("//table[@class='list-medium']/tbody[1]/tr[@class]"))
{
    string itemValue = string.Empty;
    int position = 1;
    foreach (var td in tr.DescendantNodes("td"))
    {
        itemValue = td .InnerText;
        medinetScheme.Add(new MediNetScheme(){Datum=itemValue.Remove(15),Sections=itemValue.Remove(0,15)});
        position++;
        if (position == 3)
            break;
    }
于 2012-05-10T08:45:13.243 回答
0

经过几个小时的测试不同的代码和方法来实现我想要的,我想通了。

但我必须感谢 vfportero 的回答并将其标记为答案。

我的问题的编辑版本的答案就是这段代码;)

List<MediNetScheme> medinetScheme = new List<MediNetScheme>();
        HtmlDocument htdoc = new HtmlDocument();
        htdoc.LoadHtml(results);
        foreach (HtmlNode table in htdoc.DocumentNode.SelectNodes("//table[@class='list-medium']/tbody[1]/tr[@class]"))
        {
            table.ChildNodes.RemoveAt(3);
            string itemValue = table.InnerText;
            medinetScheme.Add(new MediNetScheme(){Datum=itemValue.Remove(15),Sections=itemValue.Remove(0,15)}); 
        }
        MediNetScheme.ItemsSource = medinetScheme;

您可以看到我省略了 RemoveChild 方法,因为它没有做我想要的(请阅读我的问题的编辑),而是使用 .ChildNodes.RemoveAt(int //您要删除的孩子的位置)。希望这将有助于其他一些面临同样问题的人。

你的

于 2012-05-10T13:06:16.623 回答