0

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']/ tbody 1 /tr[@class]". このテーブルの各行には、5 つの列 td 1 ...td[5] があります。私の最初の foreach ループでは、テーブル内の各行の HTML コードを取得するために selectnodes を使用しています。私がしたいのは、各行の最初の 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;

これがあなたに役立つことを願っています:)

編集: 各行の最初の 3 つの 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 に答える