El ejemplo de HtmlAgilityPack para cambiar enlaces no funciona. ¿Cómo logro esto?

c# html-agility-pack uri xpath

Pregunta

El ejemplo en codeplex es este:

HtmlDocument doc = new HtmlDocument();
 doc.Load("file.htm");
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
 {
    HtmlAttribute att = link["href"];
    att.Value = FixLink(att);
 }
 doc.Save("file.htm");

El primer problema es HtmlDocument. ¡DocumentElement no existe! Lo que existe es HtmlDocument. DocumentNode, pero incluso cuando lo uso, no puedo acceder al atributo href como se describe. Obtuve el siguiente error:

Cannot apply indexing with [] to an expression of type 'HtmlAgilityPack.HtmlNode'

Aquí está el código que estoy tratando de compilar cuando recibo este error:

private static void ChangeUrls(ref HtmlDocument doc)
{
    foreach(HtmlNode link in doc.DocumentNode.SelectNodes("//@href"))
    {
        HtmlAttribute attr = link["href"];
        attr.Value = Rewriter(attr.Value);
    }
}

ACTUALIZACIÓN: Acabo de descubrir que el ejemplo nunca fue pensado para funcionar ... Y tengo una solución después de leer el código de ejemplo ... Publicaré mi solución para que otras personas como yo la disfruten una vez que la completen.

Respuesta aceptada

Aquí está mi solución rápida basada en partes del código de muestra incluido en el ZIP.

private static void ChangeLinks(ref HtmlDocument doc)
        {
            if (doc == null) return;
            //process all tage with link references
            HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//*[@background or @lowsrc or @src or @href]");
            if (links == null)
                return;

            foreach (HtmlNode link in links)
            {

                if (link.Attributes["background"] != null)
                    link.Attributes["background"].Value = _newPath + link.Attributes["background"].Value;
                if (link.Attributes["href"] != null)
                    link.Attributes["href"].Value = _newPath + link.Attributes["href"].Value;(link.Attributes["href"] != null)
                    link.Attributes["lowsrc"].Value = _newPath + link.Attributes["href"].Value;
                if (link.Attributes["src"] != null)
                    link.Attributes["src"].Value = _newPath + link.Attributes["src"].Value;
            }
        }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué