如何使用HTML Agility Pack编辑HTML片段

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

This is a specialSearchWord that I want to link to A hyperlink Some more text and that specialSearchWord again.

我想把它转换成这个:

 
This is a specialSearchWord that I want to link to A hyperlink Some more text and that specialSearchWord again.

我将根据这里的许多建议使用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", "specialSearchWord"); 

并将结果保存为字符串:

 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", "specialSearchWord"); divNode.InnerHtml = newDiv; Console.WriteLine(doc.DocumentNode.OuterHtml);