如何使用HTML Agility Pack編輯HTML片段

c# html-agility-pack

所以我有一個HTML代碼片段,我想用C#修改。

<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. 有兩個選項:您可以直接編輯InnerHtml屬性(或Text節點上的文本)或使用例如AppendChildPrependChild等修改dom樹。
  3. 您可以使用HtmlDocument.DocumentNode.OuterHtml屬性或使用HtmlDocument.Save方法(我個人更喜歡第二個選項)。

至於解析,我選擇在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. 有關人為舉例,請參閱下面的代碼。您可能還有其他未提及的約束,但此代碼示例應該可以幫助您入門。

請注意,您的Xpath表達式可能需要更複雜才能找到所需的div。

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合法嗎? 是的,了解原因