HtmlAgilityPack-删除集合中的所有节点
本文关键字:节点 删除 集合 HtmlAgilityPack- | 更新日期: 2023-09-27 18:20:59
我正在尝试修复使用contentEditable
时得到的这个奇怪的嵌套HTML
<span lang="">
<p>line one</p>
<p>line two</p>
</span>
我想将这些span
节点中的每一个替换为其子
<p>line one</p>
<p>line two</p>
这是我试过的。
var spans = doc.DocumentNode.Descendants().Where(x => x.Name == "span" && x.Attributes["lang"] != null).ToList();
foreach (var span in spans)
{
foreach (var child in span.ChildNodes)
{
var ch = doc.CreateElement(child.Name);
ch.InnerHtml = child.InnerHtml;
doc.DocumentNode.InsertBefore(ch, span);
}
span.Remove();
}
这将抛出一个带有以下消息的System.ArgumentOutOfRangeException
。
Node "<span lang=""></span>" was not found in the collection
我理解为什么会发生这种事。编辑文档会使我的span
元素集合失效。那么该怎么做呢?
此外,如何处理子节点中不包含的文本?假设我发现了这个元素
<span lang="">
<p>line one</p>
<p>line two</p>
line three
</span>
我该怎么解释?
请注意:这是WinRT
的HtmlAgilityPack
,因此SelectSingleNode
和所有xpath命令对我来说都不可用
对于您的问题,修复方法应该是从父节点调用InsertBefore
,而不是从document根。
此外,我认为您可以直接"移动"节点,而无需创建新节点:
foreach (var span in spans)
{
foreach (var child in span.ChildNodes)
{
span.ParentNode.InsertBefore(child, span);
}
span.Remove();
}