HTMLアジャイルパックを使用してHTMLスニペットを編集するにはどうすればよいですか

c# html-agility-pack

質問

だから私はC#を使って修正したいHTMLスニペットを持っています。

<div>
This is a specialSearchWord that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that specialSearchWord again.
</div>

私はこれをこれに変換したい:

<div>
This is a <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> that I want to link to
<img src="anImage.jpg" />
<a href="foo.htm">A hyperlink</a>
Some more text and that <a class="special" href="http://mysite.com/search/specialSearchWord">specialSearchWord</a> again.
</div>

私はHTML Agility Packをここの多くの推奨事項に基づいて使用する予定ですが、どこに行くのか分かりません。特に、

  1. 完全なHTMLドキュメントではなく、部分スニペットを文字列として読み込むにはどうすればよいですか?
  2. どのように編集するのですか?
  3. 編集されたオブジェクトのテキスト文字列を返すにはどうしたらいいですか?

受け入れられた回答

  1. 完全なHTML文書と同じです。それは問題ではありません。
  2. 2つのオプションがあります。例えば、 AppendChildPrependChildなどを使って直接InnerHtmlプロパティを編集したり、テキストノード上のTextを編集したり、domツリーを変更することができます。
  3. HtmlDocument.DocumentNode.OuterHtmlプロパティを使用するか、 HtmlDocument.Saveメソッドを使用することができます(個人的には2番目のオプションが優先されます)。

構文解析に関しては、 div内の検索語を含むテキストノードを選択し、それを置き換えるためにstring.Replaceメソッドを使用します:

var doc = new HtmlDocument();
doc.LoadHtml(html);
var textNodes = doc.DocumentNode.SelectNodes("/div/text()[contains(.,'specialSearchWord')]");
if (textNodes != null)
    foreach (HtmlTextNode node in textNodes)
        node.Text = node.Text.Replace("specialSearchWord", "<a class='special' href='http://mysite.com/search/specialSearchWord'>specialSearchWord</a>");

結果を文字列に保存する:

string result = null;
using (StringWriter writer = new StringWriter())
{
    doc.Save(writer);
    result = writer.ToString();
}

人気のある回答

回答:

  1. これを行う方法があるかもしれませんが、私は方法がわかりません。ドキュメント全体を読み込むことをお勧めします。
  2. XPathと正規表現の組み合わせを使用する
  3. 考案された例については、以下のコードを参照してください。あなたは言及されていない他の制約があるかもしれませんが、このコードサンプルはあなたを始めにします。

あなたが望むdivを見つけるには、あなたのXpath式がより複雑である必要があるかもしれないことに注意してください。

HtmlDocument doc = new HtmlDocument();

doc.Load(yourHtmlFile);
HtmlNode divNode = doc.DocumentNode.SelectSingleNode("//div[2]");
string newDiv = Regex.Replace(divNode.InnerHtml, @"specialSearchWord", 
"<a class='special' href='http://etc'>specialSearchWord</a>");
divNode.InnerHtml = newDiv;
Console.WriteLine(doc.DocumentNode.OuterHtml);


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ