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);
}
}
正在尝试解决错误的 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);
}
}