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

标签 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 并不是我想要做的,因为我实际上仍然需要元素的结构来了解什么是什么。

最佳答案

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

这里是您似乎得到的不太正确:Element != Node。您要求的是元素,但您正在寻找节点。

<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

关于c# - 为什么 AngleSharp 不为交错文本生成 TextNodes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35023960/

相关文章:

c# - 从 C# 刷新 Excel 数据透视表

c# - 在服务器端运行连续的自定义应用程序逻辑。入口点?

json - 如何从 Ruby on Rails 解析 json 数据或(json 代码)

c# - 如何从Azure表存储中查询最近的n条记录?

c# - Bitwise Barrel Shift 在 C# 中左右旋转的问题

jquery slidedown 和 slideup 摆动 div

html - CSS响应边框半径图像

html - 如何避免ie8兼容按钮?

php - 如何从对象(stdClass)中获取值?

parsing - ANTLR4:TokenStreamRewriter输出的格式不正确(删除了空格)