2009-07-16 8 views
9

Estoy usando XmlSerializer.Serialize, y produce saltos de línea y espacios innecesarios. ¿Cómo evitarlo?¿Cómo serializar un XML sin espacios innecesarios y saltos de línea? (.NET)

+0

Viejo, pero creo que la diferencia es si está usando un XmlWriter o un TextWriter. En mi experiencia, XmlWriter no tiene formato por defecto. Esto tiene sentido, porque sabe que está escribiendo un documento donde el formato no importa, mientras que un escritor de texto está escribiendo texto directo. – Timothy

Respuesta

17

¿Quizás podría usar la sobrecarga aceptando un XmlWriter, y configurar el XmlWriter dado con una instancia XmlWriterSettings?

XmlWriterSettings le permite controlar la aplicación de saltos de línea y sangría.

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

funcionó, gracias –

+1

Tuve que cambiar los parámetros alrededor de esta manera: '_serializer.Serialize (writer, o);'. Gran solución, gracias! –

2

Es interesante, pensé que no había formateo por defecto. Acabo de intentar lo siguiente y llegué sin formato:

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

en una muestra de la ejecución, se devuelve el siguiente 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

Quizás le guste más =) –

+0

Tal incoherencia se debe informar a Microsoft. Un método no puede comportarse de diferentes maneras. ¿Es dependiente de CultureInfo? ¿O es una .NET Version/Service Pack? No lo sé todavía –

+0

Si tienes la oportunidad, ejecuta el código que publiqué. Estoy ejecutando .NET 3.5 SP1. Veamos cuál es la verdadera diferencia. –

0

favor, compruebe también si las clases serializados contienen miembros de tipo XML (como XmlElement) Usé la herramienta Xsd2Code para generar clases desde XSD y (en casos muy especiales) ha creado un miembro de tipo XmlElement. Durante la serialización, este miembro tenía su propio formato (identación para ser exacto). Incluso si he activado (o desactivado) la sangría de XmlSerializer, no ha afectado al miembro de XmlElement.

Cuestiones relacionadas