2013-03-03 60 views
0

这段代码给我一个奇怪的例外。 Node "<span class="OrganisationOut"></span>" was not found in the collection但是当我检查span的外部HTML时,它的<span class="OrganisationOut">National Cheng Kung University</span>。为什么它尝试删除不同的跨度?删除孩子抛出异常

doc = web.Load(urlTeams); 

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//tr[contains(@id,'Cell')]")) 
{ 
    HtmlNode span = node.SelectSingleNode(".//span"); 
    lbResults2.Items.Add(span.InnerText); 
    lbResults.Items.Add(node.RemoveChild(span).InnerText.Trim()); 
} 
+0

不要在循环中做多余的DOM选择。 – 2013-03-03 17:29:38

+0

你的意思是'HtmlNode span = node.SelectSingleNode(“.// span”);'部分? – a1204773 2013-03-03 17:30:27

+0

http://stackoverflow.com/questions/8269590/removechild-node-was-not-found-cant-work-it-out看到这个 – 2013-03-03 17:31:16

回答

1

既然你让所有的跨度递归当前节点下(这是//意味着XPATH),你可能会得到一个span是不是node一个孩子,但一个大孩子。

在这种情况下,您所看到的呼叫node.RemoveChild(span)将失败。你想要做的是span.ParentNode.RemoveChild(span)

+0

我做了你说的,但现在lbResults和lbResults2给出相同的输出 – a1204773 2013-03-03 18:52:48

+0

哦,我解决了它...而不是做所有在一行我应该分开它...像这样'span.ParentNode.RemoveChild(span); lbResults.Items.Add(node.InnerText.Trim());'代替'lbResults.Items.Add(span.ParentNode.RemoveChild(span).InnerText.Trim());' – a1204773 2013-03-03 19:11:25

+0

谢谢@Simon Mourier – a1204773 2013-03-03 19:12:14