HTML 如果需要,Agility Pack 使用 UL 包装 LI 项目

HTML Agility Pack wrap LI items with UL if required

正在尝试解决错误的 HTML 标记。

假设我有以下标记:

<li>Foo</li>
<li>Bar</li>

<li>Foo</li>
<li>Bar</li>
</ul>

<ul>
<li>Foo</li>
<li>Bar</li>

此外,列表前后可能会有一些文字。

我尝试过的:

HtmlNode firstLiNode = doc.DocumentNode.ChildNodes.FirstOrDefault(n => n.Name.Equals("li"));
if (firstLiNode != null &&
    (firstLiNode.PreviousSibling == null || !firstLiNode.PreviousSibling.Name.Equals("ul")))
{
    doc.DocumentNode.InsertBefore(HtmlNode.CreateNode("<ul>"), firstLiNode);
}

我认为应该在第一个 <li> 标签之前添加 <ul> 标签。按照相同的逻辑,如果需要,我可以在列表的末尾插入 </ul>,然而,我得到的是 <ul></ul><li>Foo</li><li>Bar</li>,甚至没有尝试插入结束的 ul 标记。

问题:我做错了什么?

我的解决方案如下:

剥离所有 UL 标签,然后根据需要插入新标签,如下所示:

HtmlNode firstLiNode = pos.Nodes.FirstOrDefault(n => n.Name.Equals("li"));
if (firstLiNode != null)
{
    // Retrieve all LI nodes that should be wrapped with the UL tag.
    IEnumerable<HtmlNode> liNodes = doc.DocumentNode.SelectNodes(@"//li");
    HtmlNode ulNode = HtmlNode.CreateNode("<ul>");

    // Insert LI tags into newly created UL tag.
    foreach (HtmlNode liNode in liNodes)
    {
        HtmlNode clone = liNode.CloneNode(true);
        ulNode.AppendChild(clone);
    }

    // Insert newly created UL tag with child LI nodes before "original" LI tag without UL tag.
    doc.DocumentNode.InsertBefore(ulNode, firstLiNode);

    // Remove LI tags that are not wrapped with UL tag.
    foreach (HtmlNode liNode in liNodes)
    {
        doc.DocumentNode.RemoveChild(liNode);
    }
}