تحويل rtf إلى xml في C #

في استمرار سلسلة من المنشورات حول تحويل الملفات النصية إلى 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();
            }
            //      RtfPipe  Core 
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            //    RtfPipe  html
            var html = Rtf.ToHtml(rtf);
            //  html     ,   xml
            return ClearHtml(html);
        }

  1. string. RtfPipe. ,
  2. , .Net Core Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);. RtfPipe. .
    .Net Framework, .
  3. var html = Rtf.ToHtml(rtf); — html . , , , ( ), .


string ClearHtml(string html), xml:


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

  1. , HtmlAgilityPack nuget
  2. doc HtmlDocument html
  3. , , . , style, , , , .
  4. C , StringBuilder xml, .

, , , .



docx xlsx


All Articles