【问题标题】:Removing childnodes using HAP使用 HAP 删除子节点
【发布时间】:2012-05-10 00:16:05
【问题描述】:

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

System.ArgumentOutOfRangeException 未处理 在集合中找不到 Message=Node ""

我知道 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']/tbody1/tr[@class]”。此表中的每一行有 5 列 td1...td[5]。在我的第一个 foreach 循环中,我使用 selectnodes 来获取表中每一行的 HTMLcode。我想要做的是只从每行的前 3 个 td 中获取内部文本,这意味着我需要从每行中删除 td[4] 和 td[5]。当我使用您编辑的代码时,我能够摆脱第一行中的 td[4] 和 td[5] 而不是第一行之后的其他行。

这是我的 HTML 的图片:-

【问题讨论】:

    标签: windows-phone-7 html-agility-pack


    【解决方案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;
        }
    

    【讨论】:

    • 感谢 vfportero!不幸的是,即使你的方法也没有像我想要的那样工作,但我没有收到这个异常错误。但是现在的问题是它只从“表”中的第一个节点中删除子节点,而不是从后续的其他节点中删除。
    • 你到底想要什么? “ansvarig”是一个“td”单元格,“RemoveChild”正在从这个 tr 父级删除这个 td。您要删除该 tr 中的所有 td 吗?您可以发布一个示例 html 来更好地说明您的问题吗?
    • 我已更新问题以便更好地说明问题。
    【解决方案2】:

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

    但我必须感谢 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 //你想要删除的孩子的地方) . 希望这能帮助其他面临同样问题的人。

    你的

    【讨论】:

    • 感谢您的旗帜 :) 很高兴您遇到了一个不错的解决方案
    • 恭喜修复!如果可以,请确保将您的答案标记为“已接受”,以便其他人能够从您的解决方案中学习。干杯~
    猜你喜欢
    • 2018-06-26
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多