C# Anglesharp规范化/修复html

C# Anglesharp规范化/修复html,c#,html,parsing,anglesharp,C#,Html,Parsing,Anglesharp,我有这段html <div> Outside paragraph <p>In paragraph</p> </div> 因此,一段将置于段落之外的代码将进入段落AngleSharp不提供这种自定义逻辑,但它为您提供了推出自己的规范化方案的方法 在下面的示例中,我使用TreeWalker来简化仅对文本节点的迭代 代码查找给定的条件以动态插入段落 var context = BrowsingContext.New(); var documen

我有这段html

<div>
  Outside paragraph
  <p>In paragraph</p>
</div>

因此,一段将
置于段落
之外的代码将进入段落

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();
var context=BrowsingContext.New();
var document=await context.OpenAsync(res=>res.Content(“fooOutsideInside

bar”); var walker=document.CreateTreeWalker(document.Body,AngleSharp.Dom.FilterSettings.Text); while(walker.ToNext()!=null) { 无功电流=沃克电流; //如果只是空白,例如,格式化换行符,或者无论如何是在p中-跳过 如果( (current.TextContent.Trim().Length==0)|| (current.ParentElement.LocalName==“p”)) { 继续; } //如果在段落旁边,则执行规范化 否则如果( (current.PreviousSibling是IElement-previous&&previous.LocalName==“p”)|| (current.NextSibling为IElement next&&next.LocalName==“p”)) { var newNode=document.CreateElement(“p”); 当前.ReplaceWith(newNode); newNode.Append(当前); } } document.Body.ToHtml().Dump();
转储结果如下所示:

<body>foo<div><p>Outside</p><p>Inside</p></div>bar</body>
foo外部

内部

这可能不是您所需要的一切,但应该为您提供正确方向的指针

注意:您还可以滚动自己的(递归)迭代或使用自定义的
IMarkupFormatter
将规范化作为序列化。有多种方法。给定的一个会更改DOM,因此可能会进行进一步的操作(不仅仅是序列化)


希望有帮助

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();
var context=BrowsingContext.New();
var document=await context.OpenAsync(res=>res.Content(“fooOutsideInside

bar”); var walker=document.CreateTreeWalker(document.Body,AngleSharp.Dom.FilterSettings.Text); while(walker.ToNext()!=null) { 无功电流=沃克电流; //如果只是空白,例如,格式化换行符,或者无论如何是在p中-跳过 如果( (current.TextContent.Trim().Length==0)|| (current.ParentElement.LocalName==“p”)) { 继续; } //如果在段落旁边,则执行规范化 否则如果( (current.PreviousSibling是IElement-previous&&previous.LocalName==“p”)|| (current.NextSibling为IElement next&&next.LocalName==“p”)) { var newNode=document.CreateElement(“p”); 当前.ReplaceWith(newNode); newNode.Append(当前); } } document.Body.ToHtml().Dump();
转储结果如下所示:

<body>foo<div><p>Outside</p><p>Inside</p></div>bar</body>
foo外部

内部

这可能不是您所需要的一切,但应该为您提供正确方向的指针

注意:您还可以滚动自己的(递归)迭代或使用自定义的
IMarkupFormatter
将规范化作为序列化。有多种方法。给定的一个会更改DOM,因此可能会进行进一步的操作(不仅仅是序列化)


希望有帮助

弗洛里安是《安格夏普》的作者之一,他是一个非常棒的支持者。为什么不在AngleSharp GitHub存储库中?谢谢您-非常感谢!事实上,我并不是很积极地关注这个问题,但我很高兴你把他指给GH,我在那里设置了各种各样的通知。Florian,AngleSharp的作者之一,是一个非常棒的支持者。为什么不在AngleSharp GitHub存储库中?谢谢您-非常感谢!事实上,我并不是很积极地关注这件事,但我很高兴你把他指给GH,我在那里设置了各种各样的通知。真棒的支持,Florian真棒的支持,Florian