我知道我迟到了,但迟到总比没有好(我也希望其他人能从这个答案中受益)。
对这个问题的评论都是正确的。一方面,我们有 W3C 规范和文档的来源,它告诉我们(官方)序列化中不会有任何空间,另一方面,我们有一个很常见的情况,可以在适用时“整合”一些空间(或者甚至可能是换行符,例如,如果<br>
看到一个元素)。
正在编写的库不知道您的特定用例(即,当您想要插入空格时)。但是,它可以帮助您更轻松地达到您想要的状态。
从 DOM 到字符串的序列化是通过实现IMarkupFormatter
. 任何 DOM 节点的ToHtml()
方法都接受这样的对象来返回一个字符串。做一个
var myFormatter = new MyMarkupFormatter();
var text = document.Body.ToHtml(myFormatter);
现在问题简化为适用于我们的 MyMarkupFormatter 的实现。然而,这个格式化程序基本上只会产生文本节点,但某些标签会被不同地处理(即,返回一些文本,例如空格)。
public class MyMarkupFormatter : IMarkupFormatter
{
String IMarkupFormatter.Comment(IComment comment)
{
return String.Empty;
}
String IMarkupFormatter.Doctype(IDocumentType doctype)
{
return String.Empty;
}
String IMarkupFormatter.Processing(IProcessingInstruction processing)
{
return String.Empty;
}
String IMarkupFormatter.Text(ICharacterData text)
{
return text.Data;
}
String IMarkupFormatter.OpenTag(IElement element, Boolean selfClosing)
{
switch (element.LocalName)
{
case "p":
return "\n\n";
case "br":
return "\n";
case "span":
return " ";
}
return String.Empty;
}
String IMarkupFormatter.CloseTag(IElement element, Boolean selfClosing)
{
return String.Empty;
}
String IMarkupFormatter.Attribute(IAttr attr)
{
return String.Empty;
}
}
如果剥离所有非文本信息不是您需要的,那么 AngleSharp 还提供PrettyMarkupFormatter
开箱即用的功能 - 也许这已经非常接近您想要的(“更漂亮”的标记格式化程序)。
希望这可以帮助!