Dalam kelanjutan dari serangkaian posting tentang mengkonversi file teks ke xml menggunakan C #, saya mengusulkan untuk pindah ke mengkonversi file rtf .
Tampaknya format ini sangat kuno, dan sangat umum, dan jika tidak ada pustaka untuk itu mengkonversi semua data ke format xml dengan memanggil satu metode, maka pasti ada semacam solusi dari Microsoft, setidaknya mirip dengan OpenXML . Namun, jika ya, maka artikel ini tidak akan ditulis.
Jadi apa itu file ReachTextFile (rtf) ? Pada umumnya, isi file sudah terstruktur dan bahkan mengingatkan pada campuran json, xml dan xpath. Ini dapat dengan mudah diverifikasi dengan menyimpan beberapa dokumen Word dalam format rtf , dan kemudian mencoba membacanya dalam editor teks seperti Notepad ++ :

Saya menyoroti dalam merah sepotong file yang berisi informasi tentang pengkodean: secara umum, tag dienkripsi dengan pengkodean ansi, dan teks itu sendiri dikodekan dengan ansicpg1251. Teks itu sendiri terlihat seperti ini:

, , , , … , , , , 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