2010-01-22 167 views
5

星期五在這個階段真的很頭痛!我試圖使用InsertAfter()將HtmlNode添加到另一個。我可以看到麪包屑ID的refChild節點當我把它rpint到控制檯,但不斷收到以下錯誤:我應該如何使用HTMLAgilityPack AppendNode?

System.ArgumentOutOfRangeException: Node "<div id="breadcrumb"></div>" was not f 
ound in the collection 
Parameter name: node 
    at HtmlAgilityPack.HtmlNodeCollection.get_Item(HtmlNode node) 
    at HtmlAgilityPack.HtmlNode.InsertAfter(HtmlNode newChild, HtmlNode refChild) 

    at MyHome.Tasks.Tasks.DownloadandStoreContent(KeyValueP 
air`2 urlPair, String filePath, HtmlNode HtmlWrapper) in C:\Users\denis\Document 
s\Visual Studio 2008\Websites\MyHomeV2\MyHome.Tasks\Tasks.cs:line 81 
    at MyHome.Tasks.Tasks.GenerateContent(String scrape 
sSwitch, String filePath) in C:\Users\denis\Documents\Visual Studio 2008\Website 
s\MyHomeV2\MyHome.Tasks\Tasks.cs:line 27 
    at MyHome.Tasks.Program.Main(String[] args) in C:\Users\denis\Documents\Visua 
l Studio 2008\Websites\MyHomeV2\MyHome.Tasks\Program.cs:line 87 

我的代碼是:

HtmlWrapper.InsertAfter(ContentNode, HtmlWrapper.SelectSingleNode("//div[@id='breadcrumb']")); 

正如提到的我已經都打印出來HtmlWrapper和HtmlWrapper.SelectSingleNode(「// div [@ id ='breadcrumb']」)到控制檯,並可以看到屏幕上的節點。關於我要去哪兒的任何想法都是錯誤的?

感謝, 丹尼斯

回答

6

從源頭非常粗略的檢查,它看起來像InsertAfter希望refChild成爲直接兒你上調用InsertAfter節點。由於您正在爲您的div節點搜索整個後代軸(使用//),因此您通過的實際節點refChild可能不是的直接子節點HtmlWrapper

嘗試將HtmlWrapper.SelectSingleNode("//div[@id='breadcrumb']")拉成變量,然後在其ParentNode上調用InsertAfter

+0

起初並不奏效,但是我將選擇器提升了幾個級別,並最終指向HtmlWrapper節點的一個子節點。你怎麼知道它需要一個特定的孩子,而不是一個死者? –

+0

@Denis:通過google找到HtmlNodeCollection的InsertAfter,注意到被索引到的成員名爲'_childNodes',猜到:) – AakashM

+1

這裏的技巧是執行以下操作:nodeToInstertBefore.ParentNode.InsertBefore(newNode,nodeToInsertBefore)不是保證清楚,但它的作品:) – Philippe