我知道我迟到了晚会,但迟到比从未好(也希望别人可以从这个答案中获益)。
对这个问题的评论都是对的。一方面,我们有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(String text)
{
return text;
}
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
开箱 - 也许这已经相当接近你想要的东西(一个“漂亮”的标记格式)。
希望这会有所帮助!
由于文档中没有分隔,因此返回的文本中不会有任何内容。如果你想要这样的东西,你必须手动处理文档结构并决定放置分隔的位置。 –
谢谢萨米的回复,我很欣赏这个事实,这是一个频繁的要求,我希望它可以作为图书馆的一部分。特别是在需要解析HTML文档中的文本时。例如,在Elastic Search中提取文本内容和索引是每天都会发生的事情。 – Bigtoe