var parser = new AngleSharp.Parser.Html.HtmlParser();
var document = parser.Parse(theString);
var listItemsLinq = document.QuerySelectorAll("li");
foreach (var item in listItemsLinq)
{
var p = item.ParentElement.Clone(false);
var newiTem = item.Clone(false);
p.AppendChild(newiTem);
item.ParentElement.ParentElement.AppendChild(p);
item.ParentElement.RemoveChild(item);
Response.Write(document.DocumentElement.OuterHtml);
}
这为我提供了空列表,列表已创建但项目上下文尚未复制。 示例列表
<ul>
<li>one.</li>
<li>two.</li>
<li>three.</li>
<li>Four:
<ul>
<li>Four-One</li>
<li>Four-Two</li>
<li>Four-Three</li>
</ul>
</li>
<li>Five</li>
<li>Six</li>
</ul>
答案 0 :(得分:0)
我不确定你的意思是“没有复制项目上下文”。如果你可以简单地重新附加,为什么要克隆呢?
由于您使用.Clone(false)
,因此不会复制子项。因此,文本中的孩子也不会被复制。
因此从你的例子开始
<ul>
<li>one.</li>
<li>two.</li>
<li>three.</li>
<li>Four:
<ul>
<li>Four-One</li>
<li>Four-Two</li>
<li>Four-Three</li>
</ul>
</li>
<li>Five</li>
<li>Six</li>
</ul>
我们最终会得到以下内容
<ul>
</ul>
<ul>
<li></li>
</ul>
<ul>
<li></li>
</ul>
<ul>
<li></li>
</ul>
<ul>
<li></li>
</ul>
<ul>
<li></li>
</ul>
<ul>
<li></li>
</ul>
第一个列表为空,因为它是原始列表,我们已删除所有项目。
如果你想考虑嵌套列表,但希望它们分组,那么我们的解决方案可能看起来像(只是循环的内部部分):
var parent = item.ParentElement;
var p = parent.Clone(false);
p.AppendChild(item);
parent.ParentElement.AppendChild(p);
结果是
<ul>
</ul>
<ul>
<li>one.</li>
</ul>
<ul>
<li>two.</li>
</ul>
<ul>
<li>three.</li>
</ul>
<ul>
<li>
Four:
<ul>
</ul>
<ul>
<li>Four-One</li>
</ul>
<ul>
<li>Four-Two</li>
</ul>
<ul>
<li>Four-Three</li>
</ul>
</li>
</ul>
<ul>
<li>Five</li>
</ul>
<ul>
<li>Six</li>
</ul>
如果你还想将它应用于嵌套列表,那么你只需要在循环内循环:
var parent = item.ParentElement;
while (parent.ParentElement.LocalName === 'li') {
parent = parent.ParentElement.ParentElement;
}
var p = parent.Clone(false);
p.AppendChild(item);
parent.ParentElement.AppendChild(p);
这导致由单个项目组成的扁平化列表树。
希望这有帮助!