【问题标题】:How do you insert HTML into a text node in AngleSharp?如何将 HTML 插入 AngleSharp 中的文本节点?
【发布时间】:2015-10-09 21:13:17
【问题描述】:

我正在使用 AngleSharp 解析文档。我有一个文本节点(NodeName:“#text”),我想在其中插入一些 HTML。我当然可以将 NodeValue 重置为我想要的任何值,但它仍然是一个文本节点,所以所有的括号都被转义了。

如何获取文本节点的字符串值,将一些 HTML 注入其中,然后用解析后的 DOM 表示该 HTML 代替原始文本节点?

【问题讨论】:

    标签: anglesharp


    【解决方案1】:

    我猜你想要的是用多个节点替换单个文本节点。

    例如<div>foo</div>,即,

    + root
      + textnode
    

    变成

    + root
      + textnode (1)
      + element
      + textnode (2)
    

    可以<div>f<b>o</b>o</div>。我能想到的最简单的方法就是替换节点。

    var source = @"<div>foo</div>";
    var parser = new HtmlParser();
    var document = parser.Parse(source);
    var div = document.QuerySelector("div");
    div.InnerHtml = div.InnerHtml.Replace("foo", "f<b>o</b>o");
    

    现在您可以争辩说,仅仅替换文本可能不是您想要的。您可能已经有要插入的元素。因此,更好(但更复杂)的方法是拆分文本节点并插入剩余内容。

    var source = @"<div>foo</div>";
    var parser = new HtmlParser();
    var document = parser.Parse(source);
    var div = document.QuerySelector("div");
    var text = div.TextContent;
    div.RemoveChild(div.FirstChild); // assuming there is only one child
    var bold = document.CreateElement("b");
    bold.TextContent = text.Substring(1, 1); //o
    div.Append(
        document.CreateTextNode(text.Substring(0, 1)), //f
        bold,
        document.CreateTextNode(text.Substring(2, 1)));//o
    

    根据您的用例,可能会有更简单的解决方案。

    【讨论】:

    • 我的问题:我试图在 TextContent 上进行替换。
    • 是的,但 TextContent 只是纯文本(string)。因此,您必须转到包含节点(即TextNode)并对其进行修改。也许我可以插入一些帮助器以更有效地完成它(使用扩展方法 - 就像其他帮助器一样)。
    • 这是一个真实的说法:当您设置节点的InnerHtml 属性时,它会重新解析并重置其子节点?我的测试似乎表明这是真的。
    • 确实如此。 InnerHtml 将丢弃所有连接的节点并使用 HTML 解析器重新评估给定的字符串(在片段节点中;将自身用作片段上下文)。因此,这是一项非常昂贵的操作(在每个浏览器中都是如此)。
    • 好吧,这就是我的解决方案(除了不幸的“非常昂贵”的细节......)。这基本上是我想做的。
    猜你喜欢
    • 2013-05-15
    • 2019-07-22
    • 2017-04-11
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2021-12-08
    相关资源
    最近更新 更多