2009-07-16 14 views
9

Używam XmlSerializer.Serialize, a to powoduje podział linii i niepotrzebne spacje. Jak tego uniknąć?Jak serializować XML bez niepotrzebnych spacji i linii podziału? (.NET)

+0

Stare, ale sądzę, że różnica polega na tym, czy używasz XmlWriter lub TextWriter. Z mojego doświadczenia wynika, że ​​XmlWriter domyślnie nie formatuje. Ma to sens, ponieważ wie, że pisze dokument, w którym formatowanie nie ma znaczenia, podczas gdy autor tekstu pisze prosty tekst. – Timothy

Odpowiedz

17

Być może można użyć przeciążenia akceptując XmlWriter i skonfigurować podane XmlWriter z instancją XmlWriterSettings?

XmlWriterSettings pozwala kontrolować stosowanie podziałów linii i wcięć.

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

zadziałało, dzięki –

+1

Musiałem zmienić parametry w następujący sposób: '_serializer.Serialize (writer, o);'. Świetne rozwiązanie, dzięki! –

2

To ciekawe, pomyślałem, że domyślnie nie było formatowania. Właśnie próbowałem następujące i dostał żadnego formatowania:

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

w okresie próby, wrócił następujące 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

Może ci się bardziej podoba =) –

+0

Taką niespójność należy zgłosić firmie Microsoft. Metoda nie może zachowywać się na różne sposoby. To zależy od CultureInfo? Lub jest to wersja .NET/Service Pack? Jeszcze nie wiem. –

+0

Jeśli masz szansę, uruchom napisany przeze mnie kod. Korzystam z .NET 3.5 SP1. Zobaczmy, jaka jest prawdziwa różnica. –

0

Należy również sprawdzić, czy szeregowane zajęcia zawierają członków XML typu (jak XmlElement). Użyłem narzędzia Xsd2Code do wygenerowania klas od XSD i (w bardzo szczególnym przypadku) utworzył element typu XmlElement. Podczas serializacji ten element miał swoje własne formatowanie (dokładna identyfikacja). Nawet jeśli włączyłem (lub wyłączyłem) wcięcie XmlSerializer, nie miało to wpływu na element XmlElement.

Powiązane problemy