2012-05-10 2 views
0

Когда я пытаюсь удалить childnode из моей XPath я получаю странные ошибки: -Удаление ChildNodes с использованием ГАП

System.ArgumentOutOfRangeException было необработанное Message = Node «» не был найден в коллекции

Я знаю, что проблема с HAP childremoving, но idk, если они исправили ее с новой версией или нет. Мой вопрос в том, что мой код неправильный или это 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; 

Edit: -

Мой HTML документ имеет таблицу с несколькими строками, которые имеют этот XPath: - «// таблица [@ класс =" list- medium ']/tbody 1/tr [@class] ". Каждая строка в этой таблице имеет 5 столбцов td 1 ... td [5]. В моем первом цикле foreach я использую selectnodes для получения HTML-кода каждой строки в таблице. То, что я хочу сделать, это получить только внутренний текст из первых 3 td в каждой строке, что означает, что мне нужно избавиться от td [4] и td [5] из каждой строки. Когда я использовал отредактированный код, я смог избавиться от td [4] и td [5] в первой строке, но не с другими строками, которые следует за первой строкой.

Вот рис моего HTML: - enter image description here

ответ

0

После нескольких часов тестирования различных кодов и способов для того чтобы достигнуть того, что я хотел, я понял это.

Но я должен поблагодарить vfportero за его ответ и отметить его как ответ.

Ответ на отредактированной Verion моего вопроса просто этот код;)

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 // место для дочернего объекта, который вы хотите удалить). Надеюсь, это поможет некоторым другим ПКП, столкнувшимся с одной и той же проблемой.

Ваш

+0

Спасибо за ваш флаг :) Я рад, что вы столкнулись с хорошим решением – vfportero

+0

Поздравляем с исправлением! Когда вы в состоянии, пожалуйста, отметьте свой ответ как «принятый», чтобы другие могли узнать ваше решение. Приветствия ~ –

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; 

Я надеюсь, что это будет полезно для вас :)

EDITED: Вы хотите получить InnerText из трех первых td в каждой строке. Я проверяю ваш код, и я думаю, что xpath внутри foreach неверен.

Я хотел бы изменить XPath для классического подсчитывались цикла с помощью LINQ, как это:

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; 
    } 
+0

Спасибо vfportero! к сожалению, даже ваш метод не работает, как я хочу, потому что я не получаю эту ошибку исключения.Однако теперь проблема заключается в том, что он удаляет дочерний узел только из первого узла в «таблице», а не из последующих других узлов. – DreamNet

+0

Что именно вы хотите? «ansvarig» является ячейкой «td», а «RemoveChild» удаляет этот td из этого tr-родителя. Вы хотите удалить все td в этом tr? Можете ли вы опубликовать пример html, чтобы лучше подобрать свой вопрос? – vfportero

+0

Я обновил вопрос для лучшей иллюстрации проблемы. – DreamNet