¿Cómo puedo hacer que xmlserializer solo serialice xml plano?

85

Necesito obtener xml simple, sin el <?xml version="1.0" encoding="utf-16"?>al principio y xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"en el primer elemento de XmlSerializer. ¿Cómo puedo hacerlo?

Grzenio
fuente

Respuestas:

211

Para poner todo esto junto, esto funciona perfectamente para mí:

    // To Clean XML
    public string SerializeToString<T>(T value)
    {
        var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
        var serializer = new XmlSerializer(value.GetType());
        var settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.OmitXmlDeclaration = true;

        using (var stream = new StringWriter())
        using (var writer = XmlWriter.Create(stream, settings))
        {
            serializer.Serialize(writer, value, emptyNamespaces);
            return stream.ToString();
        }
    }
Simon Sanderson
fuente
1
using (var stream = new StringWriter ()) se puede cambiar a var stream = new StringWriter (); Da error con el análisis de código, ya que es necesario eliminar xmlwriter dos veces.
Archna
1
@Archna Si hiciera eso, StringWriter no se eliminaría en el caso de que la llamada XmlWriter.Create arroje una excepción. Una posible solución que cubra a los autores maliciosos de XmlWriter que realizan una implementación de IDispose que no se ajusta a la garantía de que ejecutar Dispose dos veces no hace nada para la segunda llamada implicaría un try catch y establecer el flujo en nulo dentro de using( writer ), como se puede ver en esta pregunta: stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn
¿Para qué estás usando el parámetro de tipo T?
Jesper
25

Use la XmlSerializer.Serializesobrecarga de métodos donde puede especificar espacios de nombres personalizados y pasar esto.

var emptyNs = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
serializer.Serialize(xmlWriter, objectToSerialze, emptyNs);

pasar una matriz nula o vacía no hará el truco

kossib
fuente
7
Tenga en cuenta que debe combinar esta respuesta con la respuesta de @ tobsen para obtener lo que estaba pidiendo: ¡un xml realmente limpio!
Grzenio
0

Esto escribirá el XML en un archivo en lugar de una cadena. El ticket de objeto es el objeto que estoy serializando.

Espacios de nombres utilizados:

using System.Xml;
using System.Xml.Serialization;

Código:

XmlSerializerNamespaces emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });

XmlSerializer serializer = new XmlSerializer(typeof(ticket));

XmlWriterSettings settings = new XmlWriterSettings
{
    Indent = true,
    OmitXmlDeclaration = true
};

using (XmlWriter xmlWriter = XmlWriter.Create(fullPathFileName, settings))
{
    serializer.Serialize(xmlWriter, ticket, emptyNamespaces); 
}
Keith Aymar
fuente