L'esempio di HtmlAgilityPack per la modifica dei collegamenti non funziona. Come posso realizzare questo?

c# html-agility-pack uri xpath

Domanda

L'esempio su codeplex è questo:

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");

Il primo problema è HtmlDocument. DocumentElement non esiste! Quello che esiste è HtmlDocument. DocumentNode ma anche quando lo utilizzo, non riesco ad accedere all'attributo href come descritto. Ottengo il seguente errore:

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

Ecco il codice che sto cercando di compilare quando ottengo questo errore:

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

AGGIORNAMENTO: Ho appena scoperto che l'esempio non è mai stato pensato per funzionare ... E ho una soluzione dopo aver letto il codice di esempio ... Pubblicherò la mia soluzione affinché altre persone come me possano godere una volta completate.

Risposta accettata

Ecco la mia soluzione rapida basata su parti del codice di esempio incluso nello 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;
            }
        }


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché