Formatting of XML created by DataContractSerializer

前端 未结 5 1486
不思量自难忘°
不思量自难忘° 2021-02-01 00:35

Is there an easy way to get DataContractSerializer to spit out formatted XML rather then one long string? I don\'t want to change the tags or content in any way, just have it ad

5条回答
  •  温柔的废话
    2021-02-01 01:33

    based on the other samples posted here that use XmlWriter, here's a version (from http://ClipFlair.codeplex.com) that works with streams (and Ionic.Zip library in specific) and also shows how the code is when you don't apply formatting (using conditional compilation - just comment out the #define to make it write unformatted XML)

    #define WRITE_FORMATTED_XML
    
    using System.Xml;
    
    namespace ClipFlair.Windows
    {
    
      public partial class BaseWindow : FloatingWindow
      {
    
        //...
    
        #if WRITE_FORMATTED_XML
        private static XmlWriterSettings XML_WRITER_SETTINGS = new XmlWriterSettings() { Indent=true, IndentChars="  "};
        #endif
    
        //...
    
        public virtual void SaveOptions(ZipFile zip, string zipFolder = "") //THIS IS THE CORE SAVING LOGIC
        {
          if (SavingOptions != null) SavingOptions(this, null); //notify any listeners
    
          View.Busy = true;
          try
          {
            ZipEntry optionsXML = zip.AddEntry(zipFolder + "/" + View.GetType().FullName + ".options.xml",
              new WriteDelegate((entryName, stream) =>
              {
                DataContractSerializer serializer = new DataContractSerializer(View.GetType()); //assuming current View isn't null
                #if WRITE_FORMATTED_XML
                using (XmlWriter writer = XmlWriter.Create(stream, XML_WRITER_SETTINGS))
                  serializer.WriteObject(writer, View);
                #else
                serializer.WriteObject(stream, View);
                #endif
              }));
          }
          catch (Exception e)
          {
            MessageBox.Show("ClipFlair options save failed: " + e.Message); //TODO: find the parent window
          }
          finally
          {
            View.Busy = false; //in any case (error or not) clear the Busy flag
          }
    
          if (SavedOptions != null) SavedOptions(this, null); //notify any listeners
        }
    
        //...
    
      }
    
    }
    

提交回复
热议问题