【发布时间】:2015-10-09 21:13:17
【问题描述】:
我正在使用 AngleSharp 解析文档。我有一个文本节点(NodeName:“#text”),我想在其中插入一些 HTML。我当然可以将 NodeValue 重置为我想要的任何值,但它仍然是一个文本节点,所以所有的括号都被转义了。
如何获取文本节点的字符串值,将一些 HTML 注入其中,然后用解析后的 DOM 表示该 HTML 代替原始文本节点?
【问题讨论】:
标签: anglesharp
我正在使用 AngleSharp 解析文档。我有一个文本节点(NodeName:“#text”),我想在其中插入一些 HTML。我当然可以将 NodeValue 重置为我想要的任何值,但它仍然是一个文本节点,所以所有的括号都被转义了。
如何获取文本节点的字符串值,将一些 HTML 注入其中,然后用解析后的 DOM 表示该 HTML 代替原始文本节点?
【问题讨论】:
标签: anglesharp
我猜你想要的是用多个节点替换单个文本节点。
例如<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
根据您的用例,可能会有更简单的解决方案。
【讨论】:
string)。因此,您必须转到包含节点(即TextNode)并对其进行修改。也许我可以插入一些帮助器以更有效地完成它(使用扩展方法 - 就像其他帮助器一样)。
InnerHtml 属性时,它会重新解析并重置其子节点?我的测试似乎表明这是真的。
InnerHtml 将丢弃所有连接的节点并使用 HTML 解析器重新评估给定的字符串(在片段节点中;将自身用作片段上下文)。因此,这是一项非常昂贵的操作(在每个浏览器中都是如此)。