Konvertieren Sie RTF in XML in C #

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();
            }
            //      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