2009-07-16 2 views
9

Ich verwende XmlSerializer.Serialize, und es erzeugt Zeilenumbrüche und unnötige Leerzeichen. Wie man es vermeidet?Wie wird ein XML ohne unnötige Leerzeichen und Zeilenumbrüche serialisiert? (.NET)

+0

Alt, aber ich glaube der Unterschied ist, ob Sie einen XmlWriter oder einen TextWriter verwenden. Meiner Erfahrung nach verwendet XmlWriter standardmäßig keine Formatierung. Dies macht Sinn, weil es weiß, dass es ein Dokument schreibt, bei dem die Formatierung keine Rolle spielt, während ein Textschreiber gerade Text schreibt. – Timothy

Antwort

17

Vielleicht könnten Sie die Überlast verwenden, die eine XmlWriter akzeptiert, und die angegebene XmlWriter mit einer XmlWriterSettings Instanz konfigurieren?

XmlWriterSettings können Sie die Anwendung von Zeilenumbrüchen und Einzug steuern.

void Serialize(Object o) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = false; 
    settings.NewLineHandling = NewLineHandling.None; 
    //settings.OtherProperties = values; 

    using (XmlWriter writer = XmlWriter.Create(CreateStream(), settings)) 
    { 
     _serializer.Serialize(writer, o); 
    } 
} 
+0

es hat funktioniert, danke –

+1

Ich musste die Parameter so umschalten: '_serializer.Serialize (writer, o);'. Tolle Lösung, danke! –

2

Es ist interessant, ich dachte, es gab keine Formatierung standardmäßig. Ich habe gerade versucht, die folgende und bekam keine Formatierung:

using (var stream = new MemoryStream()) 
{ 
    System.Text.Encoding encoding; 
    using (var writer = XmlWriter.Create(stream)) 
    { 
     if (writer == null) 
     { 
      throw new InvalidOperationException("writer is null"); 
     } 

     encoding = writer.Settings.Encoding; 
     var ser = new XmlSerializer(obj.GetType()); 
     ser.Serialize(writer, obj); 
    } 

    stream.Position = 0; 
    using (var reader = new StreamReader(stream, encoding, true)) 
    { 
     return reader.ReadToEnd(); 
    } 
} 

in einem Probelauf, es gab den folgenden XML:

<?xml version="1.0" encoding="utf-8"?><obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><childOne /><childTwo /><text>text1</text><text>text2</text></obj> 
+2

Vielleicht mag es Sie mehr =) –

+0

Eine solche Inkonsistenz sollte Microsoft gemeldet werden. Eine Methode kann sich nicht auf unterschiedliche Weise verhalten. Es ist CultureInfo abhängig? Oder es ist ein .NET Version/Service Pack? Ich weiß es noch nicht. –

+0

Wenn Sie eine Chance bekommen, führen Sie den Code aus, den ich gepostet habe. Ich verwende .NET 3.5 SP1. Mal sehen, was der wirkliche Unterschied ist. –

0

Bitte beachten Sie auch prüfen, ob serialisierte Klassen Mitglieder des XML-Typs enthalten (wie XmlElement). Ich habe das Xsd2Code-Tool verwendet, um Klassen aus XSD zu generieren und (in ganz speziellen Fällen) hat es ein Member vom Typ XmlElement erstellt. Während der Serialisierung hatte dieses Mitglied seine eigene Formatierung (genaue Bezeichnung). Selbst wenn ich den XmlSerializer-Einzug aktiviert (oder deaktiviert) hätte, hätte dies keine Auswirkungen auf das XmlElement-Mitglied.