Пример HtmlAgilityPack для изменения ссылок не работает. Как мне это сделать? - PullRequest
2 голосов
/ 05 октября 2009

Пример codeplex выглядит так:

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

Первая проблема - HtmlDocument. DocumentElement не существует! То, что существует, это HtmlDocument. DocumentNode , но даже когда я использую его вместо этого, я не могу получить доступ к атрибуту href, как описано. Я получаю следующую ошибку:

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

Вот код, который я пытаюсь скомпилировать, когда получаю эту ошибку:

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

ОБНОВЛЕНИЕ: Я только что обнаружил, что пример никогда не должен был работать ... И у меня есть решение после прочтения кода примера ... Я выложу свое решение для других людей, таких как чтобы я наслаждался, когда закончил.

1 Ответ

11 голосов
/ 07 октября 2009

Вот мое быстрое решение, основанное на частях примера кода, включенных в 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;
            }
        }
...