HTML 敏捷包 - ReplaceNode 不会更改正文的 InnerHTML

Posted

技术标签:

【中文标题】HTML 敏捷包 - ReplaceNode 不会更改正文的 InnerHTML【英文标题】:HTML Agility Pack - ReplaceNode doesn't change the InnerHTML of the Body 【发布时间】:2011-02-05 04:07:55 【问题描述】:

我有这个

身体:

<body><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent leo leo, ultrices eu venenatis et, rutrum fringilla dolor.</p></body>

代码:

htmlNode body = doc.DocumentNode.SelectSingleNode("//body");

Dictionary<HtmlNode, HtmlNode> toReplace = new Dictionary<HtmlNode, HtmlNode>();

// I do some logic here adding nodes to the toReplace dictionary.

foreach (HtmlNode replaceNode in toReplace.Keys)

    replaceNode.ParentNod.ReplaceChild(toReplace[replaceNode], replaceNode);

执行此操作后,主体节点的 InnerHtml 与开始时保持一致,尽管 OutterHtml 或 InnerText 显示出良好的结果。我的代码有问题吗?

结果:

// body.InnerHtml
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent leo leo, ultrices eu venenatis et, rutrum fringilla dolor.</p>

// body.OutterHtml
<body><p>Lorem ipsum dolor sit amet...</p></body>

【问题讨论】:

你在这里的东西看起来不错。但很难说没有看到新旧节点。你能展示一个body和一对新旧节点的例子吗? Rohit,我已经添加了示例。 【参考方案1】:

我认为这可能与您添加节点以替换旧节点的方式有关。查看此解决方案是否适用于截断文本节点。我做了一个快速测试,所有三个都给了我相同的结果。

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlString);
HtmlNode body = doc.DocumentNode.SelectSingleNode("//body");

foreach (var paragraph in body.Descendants("p"))

    paragraph.InnerHtml = paragraph.InnerHtml.Substring(0, 25) + "...";


Console.WriteLine(body.InnerHtml);
Console.WriteLine(body.InnerText);
Console.WriteLine(body.OuterHtml); 

【讨论】:

确实,这与我在更换节点之前对身体所做的事情有关。我对其他错误做了一些工作,好消息是现在可以了。不幸的是,我不知道为什么:)

以上是关于HTML 敏捷包 - ReplaceNode 不会更改正文的 InnerHTML的主要内容,如果未能解决你的问题,请参考以下文章

HTML 敏捷包

HTML 敏捷包 - 解析表

HTML 敏捷包

HTML 敏捷包选择节点

HTML 敏捷包,无法选择节点

Html 敏捷包 - 新的 HtmlAttribute