Frage

Gibt es eine einfache Möglichkeit, DataContractSerializer auszuspucken formatierte XML zu erhalten anstatt einer langen Schnur? Ich will nicht die Tags oder Inhalte in irgendeiner Weise ändern, nur haben sie Zeilenumbrüche und Einzüge in dem die XML besser lesbar zu machen?

<tagA>
   <tagB>This is</tagB>   
   <tagC>Much</tagC>
   <tagD>
      <tagE>easier to read</tagE>
   </tagD>
</tagA>


<tagA><tagB>This is</tagB><tagC>Much</tagC><tagD><tagE>harder to read</tagE></tagD></tagA>
War es hilfreich?

Lösung

Wie bendewey sagt, XmlWriterSettings ist, was Sie brauchen - zum Beispiel so etwas wie

var ds = new DataContractSerializer(typeof(Foo));

var settings = new XmlWriterSettings { Indent = true };

using (var w = XmlWriter.Create("fooOutput.xml", settings))
    ds.WriteObject(w, someFoos);

Andere Tipps

Werfen Sie einen Blick auf die Indent Eigenschaft der XmlWriterSettings

Update: Hier ist ein guter Link von MSDN auf Gewusst wie: Geben Sie das Ausgabeformat auf dem XmlWriter

Darüber hinaus ist hier ein Beispiel:

class Program
{
    static void Main(string[] args)
    {
        var Mark = new Person()
        {
            Name = "Mark",
            Email = "mark@example.com"
        };

        var serializer = new DataContractSerializer(typeof(Person));

        var settings = new XmlWriterSettings()
        {
            Indent = true,
            IndentChars = "\t"
        };

        using (var writer = XmlWriter.Create(Console.Out, settings))
        {
            serializer.WriteObject(writer, Mark);
        }
        Console.ReadLine();
    }
}
public class Person
{
    public string Name { get; set; }
    public string Email { get; set; }
}

Seien Sie vorsichtig über Leerzeichen in XML-Dokumenten Anpassen! Anpassen der Leerzeichen wird die XML besser lesbar für uns Menschen machen, aber es kann mit Maschinen Parsing stören.

Nach dem XML-Standard , Leerzeichen ist wichtig, standardmäßig. Mit anderen Worten, so weit wie XML betrifft, Leerraum begnügt .

Wenn Sie Ihr schön formatierte XML in ein XML-Dokument-Objekt ernähren, werden Sie ein anderes Ergebnis als die Version erhalten, die keine Leerzeichen oder Zeilenumbrüche beinhaltet. Sie werden zusätzliche Textknoten erhalten auf die Version hinzugefügt, die formatiert wurde.

Mit diesem MSDN-Artikel auf XML White Space einige Beispiele, die zeigen, hat wie schwierig weißer Raum sein kann.

Wenn Sie die XML-Formatierung sind nur für den menschlichen Verzehr, spielt es keine Rolle. Aber wenn Sie versuchen, Round-Trip-formatierten Dokument, könnten Sie in Schwierigkeiten geraten.

Da eine der wichtigsten Hauptvorteile von DataContractSerializer ist die Möglichkeit, Objekte zu serialisiert und deserialisiert XML nahtlos , es ist in der Regel am besten, den hässlichen Ausgang allein zu lassen.

ich in der Regel die Ausgabe in Editor einfügen ++ und eine XML-ordentlich Makro über sie laufen, wenn ich es für Debugging-Zwecke lesen möchten.

    public static string SerializeEntity<T>(T source)
    {
        using (MemoryStream ms = new MemoryStream())
        {

                NetDataContractSerializer serializer = new NetDataContractSerializer();
                serializer.Serialize(ms, source);
                return System.Text.Encoding.ASCII.GetString(ms.ToArray());

        }
    }

    public static T DeSerializeEntity<T>(string xml)
    {
        using (MemoryStream ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(xml)))
        {
                NetDataContractSerializer serializer = new NetDataContractSerializer();
                return (T)serializer.Deserialize(ms);
        }
    }

basierend auf den anderen Proben hier gepostet, die XmlWriter verwenden, ist hier eine Version (von http://ClipFlair.codeplex.com ), die mit Strömen (und Ionic.Zip Bibliothek in spezifischen) und zeigen auch, wie der Code funktioniert, wenn Sie (mit bedingter Kompilierung nicht Formatierung anwenden - kommentieren Sie einfach den #define es unformatierte XML machen schreiben)

#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
    }

    //...

  }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top