リンクを変更するための HtmlAgilityPack の例が機能しません。これを実現するにはどうすればよいですか?
-
19-09-2019 - |
質問
の例 コードプレックス これですか :
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 です。ドキュメント要素 存在しない!存在するのは HtmlDocument です。ドキュメントノード しかし、代わりにそれを使用した場合でも、説明されているように 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);
}
}
アップデート: この例は決して動作するように意図されていなかったことがわかりました...そして、サンプルコードを読んだ後、解決策が見つかりました...完成したら、私のような他の人が楽しめるように、解決策を投稿します。
解決
ここでは、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;
}
}
所属していません StackOverflow