2010-01-22 26 views
5

¡Tengo un verdadero dolor de cabeza en esta etapa un viernes! Estoy tratando de agregar un HtmlNode a otro usando InsertAfter(). Puedo ver el nodo refChild con id de migas de pan cuando rpint a la consola, pero obtengo el siguiente error:¿Cómo debo usar 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 

Mi código es:

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

Y como se mencionó he impreso a cabo tanto HtmlWrapper y HtmlWrapper.SelectSingleNode ("// div [@ id = 'breadcrumb']") a la consola y pueden ver el nodo en la pantalla. ¿Alguna idea sobre dónde me estoy equivocando aquí?

Gracias, Denis

Respuesta

6

De un examen muy superficial de la fuente, parece que quiere InsertAfterrefChild para ser un hijo directodel nodo se invoca en InsertAfter. Dado que está buscando todo el eje descendente (con //) para su nodo div, es posible que el nodo real que pase como refChild no sea un hijo directo de HtmlWrapper.

Pruebe tirando HtmlWrapper.SelectSingleNode("//div[@id='breadcrumb']") en una variable y luego invocando InsertAfter en su ParentNode.

+0

Eso no funcionó al principio pero elevé mi selector unos niveles y finalmente apunté a un elemento secundario del nodo HtmlWrapper. ¿Cómo sabías que necesitaba un niño de manera específica y no un descendiente? –

+0

@Denis: encontró la fuente a través de google para HtmlNodeCollection InsertAfter, notó que el miembro al que se indexaba se llamaba '_childNodes', adivinado :) – AakashM

+1

El truco aquí es hacer lo siguiente: nodeToInstertBefore.ParentNode.InsertBefore (newNode, nodeToInsertBefore) No es muy bueno, pero funciona :) – Philippe