Использование HtmlAgility для группировки элементов вместе - PullRequest
0 голосов
/ 30 августа 2011

Я пытаюсь взять HTML-документ и сгруппировать его по разделам, основанным на тегах заголовков, используя HTML Agility Вот как выглядит необработанный HTML-код

<h3>Header 1</h3>
<p>Text...</p>
<p>More Text...</p>
<h3Header 2</h3>
<p>Text...</p>
<p>More Text...</p>
<p>Even more Text...</p>
<h3>Header 3</h3>
<p>Some Text...</p>

и я хочу, чтобы после того, как я сгруппировал его, получилось что-то вроде этого

<div id="header_1">
  <h3>Header 1</h3>
  <p>Text...</p>
  <p>More Text...</p>
</div>

<div id="header_2">
  <h3Header 2</h3>
  <p>Text...</p>
  <p>More Text...</p>
  <p>Even more Text...</p>
</div>

<div id="header_3">
  <h3>Header 3</h3>
  <p>Some Text...</p>
</div>

или как это

<h3>Header 1</h3>
<div id="header_1">
  <h3>Header 1</h3>
  <p>Text...</p>
  <p>More Text...</p>
</div>


<h3Header 2</h3>
<div id="header_2">
  <p>Text...</p>
  <p>More Text...</p>
  <p>Even more Text...</p>
</div>

<h3>Header 3</h3>
<div id="header_3">
  <p>Some Text...</p>
</div>

Гибкость HTML - это здорово, но если кто-нибудь знает другой способ сделать это, это было бы здорово!

1 Ответ

1 голос
/ 02 марта 2012

Это довольно легко сделать с помощью AgilityPack.Сначала вам нужно получить все верхние значения <h3> s, создать <div> до (или после) каждого <h3>, затем выполнить итерации по следующим братьям и сестрам текущего <h3> до следующего <h3> или конца братьев и сестер.найти и, наконец, переместить эти узлы во вновь созданные <div>:

var h3s = doc.DocumentNode.SelectNodes("h3");
var idx = 1;
foreach (var h3 in h3s)
{
    var div = HtmlNode.CreateNode(string.Format("<div id='header_{0}'></div>", idx++));
    h3.ParentNode.InsertBefore(div, h3);
    var group = new List<HtmlNode> { h3 };

    for (var next = h3.NextSibling; next != null && next.Name != "h3"; next = next.NextSibling)
        group.Add(next);

    foreach (var item in group)
    {
        item.Remove();
        div.AppendChild(item);
    }
}

. Это даст вам что-то вроде (я исправил <h3Header 2</h3> из вашего источника):

<div id='header_1'>
  <h3>Header 1</h3>
  <p>Text...</p>
  <p>More Text...</p>
</div>
<div id='header_2'>
  <h3>Header 2</h3>
  <p>Text...</p>
  <p>More Text...</p>
  <p>Even more Text...</p>
</div>
<div id='header_3'>
  <h3>Header 3</h3>
  <p>Some Text...</p>
</div>
...