AngleSharp не предоставляет такой пользовательской логики, но дает вам возможность развернуть свои собственные схемы нормализации.
В следующем примере я использую TreeWalker
для упрощения итерации только по текстовым узлам.
Код ищет заданные условия для динамической вставки абзаца.
var context = BrowsingContext.New();
var document = await context.OpenAsync(res => res.Content("foo<div>Outside<p>Inside</p></div>bar"));
var walker = document.CreateTreeWalker(document.Body, AngleSharp.Dom.FilterSettings.Text);
while (walker.ToNext() != null)
{
var current = walker.Current;
// if just whitespace, e.g., formatting line breaks, or in p anyway - skip
if (
(current.TextContent.Trim().Length == 0) ||
(current.ParentElement.LocalName == "p"))
{
continue;
}
// if next to paragraph perform the normalization
else if (
(current.PreviousSibling is IElement previous && previous.LocalName == "p") ||
(current.NextSibling is IElement next && next.LocalName == "p"))
{
var newNode = document.CreateElement("p");
current.ReplaceWith(newNode);
newNode.Append(current);
}
}
document.Body.ToHtml().Dump();
Полученный результат выглядит следующим образом:
<body>foo<div><p>Outside</p><p>Inside</p></div>bar</body>
Это потенциально не все , что вам нужно, но должно дать вам указатель в правильном направлении.
Примечание : Вы также можете выполнить собственную (рекурсивную) итерацию или использовать, например, пользовательский IMarkupFormatter
, чтобы выполнить нормализацию в качестве сериализации. Есть несколько способов. Данный изменяет DOM - так как такие дальнейшие операции (не только сериализация) могут быть возможны.
Надеюсь, это поможет!