【问题标题】:How to replace a value with HTMLAgilityPack如何用 HTMLAgilityPack 替换一个值
【发布时间】:2022-11-16 23:57:08
【问题描述】:

我试图在字符串中找到 H2s,并替换它们以将 id 添加到每个 H2

var doc = new HtmlDocument();
doc.LoadHtml(blogsContent);
foreach (var node in doc.DocumentNode.SelectNodes("//h2"))
{
   var testing = node.OuterHtml.Replace("<h2>", "<h2 id=\"" + node.InnerText + "\">");
   // This does the job and changes the <h2> to a <h2 id="..."
}
var html = doc.DocumentNode.OuterHtml; 
// However, here, the whole document after the foreach does not include any of the replacements. 

我如何让var html 拥有foreach 应该实施的所有更改?

我查看了 StackOverflow,并没有真正找到可以解决我的问题的相同问题。如果我愚蠢,我深表歉意。

【问题讨论】:

  • 您构建了 testing var 但您没有将其设置回节点内容。那就是说,你为什么不node.SetAttributeValue("Id",node.InnerText)? HtmlAgilityPack 的全部目的是避免操作字符串
  • 哦,@SteveB。我爱你。

标签: c# html-agility-pack


【解决方案1】:

请试试这个:

    var doc = new HtmlDocument();
    doc.LoadHtml(@"
    <div>
        <h2>val 1</h2>
        <h2>val 2</h2>
        <h2>val 3</h2>
    </div>  
    ");
    foreach (var node in doc.DocumentNode.SelectNodes("//h2"))
    {
       node.SetAttributeValue("id",node.InnerText);
       // This does the job and changes the <h2> to a <h2 id="..."
    }
    var html = doc.DocumentNode.OuterHtml; 
    Console.WriteLine(html);

正如我在评论中所说,HTMLAgilityPack 的目的(和好处)是避免字符串操作。

想象你们中的某些人 h2 包含禁止使用的字符,例如 Why "&gt;&lt;script&gt;alert("bang")&lt;/script&gt;&lt;/h2&gt; &lt;h2&gt; should be escaped ?

这将导致:

<h2 id="Why "><script>alert("bang")</script> <h2> should be escaped ?">val 1</h2>

这显然是一个危险的缺陷(导致 XSS 攻击)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2015-07-15
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多