في استمرار سلسلة من المنشورات حول تحويل الملفات النصية إلى xml باستخدام C # ، أقترح الانتقال إلى تحويل ملفات rtf .
يبدو أن هذا التنسيق قديم جدًا ، وهو واسع الانتشار للغاية ، وإذا لم تكن هناك مكتبة لتحويل جميع البيانات إلى تنسيق xml عن طريق استدعاء طريقة واحدة ، فيجب بالتأكيد أن يكون هناك نوع من الحلول من Microsoft ، على الأقل مشابهة لـ OpenXML . ومع ذلك ، إذا كانت كذلك ، لما كتبت هذه المقالة.
إذن ما هو ملف ReachTextFile (rtf) ؟ بشكل عام ، فإن محتويات الملف منظمة بالفعل وتذكرنا بمزيج من json و xml و xpath. يمكن التحقق من ذلك بسهولة عن طريق حفظ بعض مستندات Word بتنسيق rtf ، ثم محاولة قراءتها في محرر نص مثل Notepad ++ :

لقد أبرزت باللون الأحمر قطعة من الملف تحتوي على معلومات حول الترميز: بشكل عام ، يتم تشفير العلامات بترميز ansi ، ويتم ترميز النص نفسه باستخدام ansicpg1251. يبدو النص نفسه كما يلي:

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