In der Fortsetzung einer Reihe von Beiträgen zum Konvertieren von Textdateien in XML mit C # schlage ich vor, mit dem Konvertieren von RTF- Dateien fortzufahren .
Es scheint, dass dieses Format ziemlich alt und sehr verbreitet ist. Wenn es keine Bibliothek gibt, mit der alle Daten durch Aufrufen einer Methode in das XML-Format konvertiert werden können, muss es definitiv eine Lösung von Microsoft geben, zumindest ähnlich wie OpenXML . Wenn dies jedoch der Fall wäre, wäre dieser Artikel nicht geschrieben worden.
Was ist eine ReachTextFile (rtf) -Datei ? Im Großen und Ganzen ist der Inhalt der Datei bereits strukturiert und erinnert sogar an eine Mischung aus json, xml und xpath. Dies kann leicht überprüft werden, indem ein Word-Dokument im RTF- Format gespeichert und dann versucht wird, es in einem Texteditor wie Notepad ++ zu lesen :

Ich habe einen Teil der Datei, der Informationen zur Codierung enthält, rot hervorgehoben: Im Allgemeinen werden die Tags mit der Ansi-Codierung verschlüsselt, und der Text selbst wird mit ansicpg1251 codiert. Der Text selbst sieht folgendermaßen aus:

, , , , … , , , , php.
, , , , , , , . - .
, , , rtf RichTextBox
, :
- -,
Windows.Forms
, . - -, . ,
RichTextBox
, , .
, nuget RtfPipe. .
RtfPipe . rtf html. , HtmlAgilityPack.
, - ? : , , , , . , rtf- , , , , — , , , , , .
, .
public string Convert(Stream stream)
{
stream.Position = 0;
string rtf = string.Empty;
using (StreamReader sr = new StreamReader(stream))
{
rtf = sr.ReadToEnd();
}
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var html = Rtf.ToHtml(rtf);
return ClearHtml(html);
}
- string.
RtfPipe
. , - , .Net Core
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
. RtfPipe. .
.Net Framework, . var html = Rtf.ToHtml(rtf);
— html . , , , ( ), .

string ClearHtml(string html)
, xml:
string ClearHtml(string html)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var elementsWithStyleAttribute = doc.DocumentNode.SelectNodes("//@style");
var excessNodes = doc.DocumentNode.SelectNodes("//b|//u|//strong|//br");
foreach (var element in excessNodes)
{
element.ParentNode.InnerHtml = element.InnerText;
element.Remove();
}
foreach (var element in elementsWithStyleAttribute)
{
element.Attributes["style"].Remove();
}
using (StringWriter writer = new StringWriter())
{
doc.Save(writer);
html = writer.ToString();
}
StringBuilder xml = new StringBuilder();
xml.Append("<?xml version=\"1.0\"?><documents><document>");
xml.Append(html);
xml.Append("</documents></document>");
return xml.ToString();
}
- , HtmlAgilityPack nuget
doc
HtmlDocument
html
- , , . ,
style
, , , , . - C ,
StringBuilder
xml, .
, , , .
docx xlsx