我知道我遲到了晚會,但遲到比從未好(也希望別人可以從這個答案中獲益)。
對這個問題的評論都是對的。一方面,我們有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