0

在 AngleSharp 中,我如何遍历所有列表项(包括嵌套项)并将每个列表项转换为具有父属性的单个列表。我尝试了下面的代码

  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>
4

1 回答 1

0

我不确定您所说的“项目上下文尚未被复制”是什么意思。如果您可以简单地重新附加,为什么要进行所有克隆?

由于您使用.Clone(false)的孩子不会被复制。因此,文本 children 也不会被复制。

因此从你的例子开始

<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>

第一个列表是空的,因为它是我们删除所有项目的原始列表。

解决方案 1

如果您想考虑嵌套列表,但希望将它们分组,那么我们的解决方案可能看起来像(仅循环的内部部分):

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>

解决方案 2

如果您还想将此应用于嵌套列表,那么您只需要在循环内循环:

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);

这导致由单个项目组成的扁平化列表树。

希望这可以帮助!

于 2017-12-14T18:56:43.073 回答