为什么AngleSharp不为交错文本生成TextNodes?

use*_*325 2 html c# parsing text anglesharp

我正在尝试使用AngleSharp库解析一些HTML,这个库到目前为止一直很棒.我现在偶然发现了一个我要解析以下HTML的场景:

<a name="someLink" href="#someLink">Link 1</a>
Some text that happens to be in between elements...
<b>Some stuff in bold</b>
Some more text
<br>
Run Code Online (Sandbox Code Playgroud)

当然,这段HTML包含了父元素等,但是这段HTML的解析元素的结果列表是:

  • HtmlAnchorElement
  • HtmlBoldElement
  • HtmlBreakRowElement

有效地跳过元素之间的文本.我如何获得此文本?我认为AngleSharp会为这些部分生成TextNodes吗?

请注意,获取父级的完整TextContent不是我想要做的,因为我实际上仍然需要元素的结构来知道什么是什么.

Luc*_*ski 6

这种行为实际上是DOM规范所期望的.你可能没有意识到这一点,但你已经回答了自己的问题:)

这就是你看起来不太对劲:Element!= Node.您询问了元素,但是您正在寻找节点.

<a>etc 这样的标签最终成为元素,而文本节点则是...井......节点,而不是元素.而且你要求API为你提供元素.换句话说,您告诉API您不希望返回文本节点.

我们来做一个简单的演示.

var parser = new HtmlParser();
var doc = parser.Parse(@"<div id=""content"">
        <a name=""someLink"" href=""#someLink"">Link 1</a>
        Some text that happens to be in between elements...
        <b>Some stuff in bold</b>
        Some more text
        <br>
    </div>");
var content = doc.GetElementById("content");
Run Code Online (Sandbox Code Playgroud)

现在,这基本上就是你一直在做的事情:

foreach (var element in content.Children)
    Console.WriteLine(element.GetType().Name);
Run Code Online (Sandbox Code Playgroud)

这输出:

HtmlAnchorElement
HtmlBoldElement
HtmlBreakRowElement

就是你想要的:

foreach (var element in content.ChildNodes)
    Console.WriteLine(element.GetType().Name);
Run Code Online (Sandbox Code Playgroud)

现在的输出是:

TextNode
HtmlAnchorElement
TextNode
HtmlBoldElement
TextNode
HtmlBreakRowElement
TextNode