2012-05-10 28 views
0

當我試圖從我的XPath我得到一個奇怪的錯誤刪除childnode刪除的childNodes: -使用HAP

System.ArgumentOutOfRangeException了未處理 消息=節點「」集合

在未找到

我知道HAP childremoving存在問題,但是如果他們已經使用新版本修復了idk,則會出現問題。我的問題是我的代碼錯了,還是很危險?無論哪種方式,有什麼辦法來解決這個問題,並刪除這些孩子節點?

這裏是我的代碼: -

 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幾行的表: - 「//表[@類='列表 - 中等']/tbody 1/tr [@class]「。此表中的每一行都有5列td 1 ... td [5]。在我的第一個foreach循環中,我使用selectnodes來獲取表格中每一行的HTMLcode。我想要做的只是從每行的前3個td中獲取內部文本,這意味着我需要從每一行中去掉td [4]和td [5]。當我使用你的編輯代碼時,我能夠在第一行中除去td [4]和td [5],但是在第一行之後沒有其他行。

這裏是我的HTML的一個事先知情同意: - enter image description here

回答

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之法怎麼把它沒有做什麼,我想(PLZ讀我的問題的編輯),而是我使用.ChildNodes.RemoveAt(詮釋/你想要刪除的孩子的地方)。 希望這將有助於其他一些人面臨同樣的問題。

您的

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

我希望這將是有益的你:)

編輯: 您是否想要獲取每行中三個第一個td的InnerText。 我正在檢查你的代碼,我認爲foreach中的xpath是錯誤的。

我會改變的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」正在刪除這個tr父母的這個td。你想刪除該tr中的所有td嗎?你可以發佈一個示例html來更好地說明你的問題嗎? – vfportero

+0

我已更新問題以更好地說明問題。 – DreamNet