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

时间:2016-01-26 21:06:38

标签: c# html 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>

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

  • HtmlAnchorElement
  • HtmlBoldElement
  • HtmlBreakRowElement

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

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

1 个答案:

答案 0 :(得分:6)

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

以下是您似乎不太正确的元素!=节点。你问了元素,但是你正在寻找节点。

<a>等标签最终作为元素,而文本节点是......好......节点,而不是元素。而且你要求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");

现在,这里基本上是you've been doing

foreach (var element in content.Children)
    Console.WriteLine(element.GetType().Name);

输出:

  

HtmlAnchorElement
  HtmlBoldElement
  HtmlBreakRowElement

以下是what you want

foreach (var element in content.ChildNodes)
    Console.WriteLine(element.GetType().Name);

现在输出是:

  

TextNode
  HtmlAnchorElement
  TextNode
  HtmlBoldElement
  TextNode
  HtmlBreakRowElement
  TextNode