Como posso fazer com que o xmlserializer serialize apenas xml simples?

86

Eu preciso obter xml simples, sem o <?xml version="1.0" encoding="utf-16"?>no início e xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"no primeiro elemento de XmlSerializer. Como eu posso fazer isso?

Grzenio
fonte

Respostas:

216

Para colocar tudo junto - isso funciona perfeitamente para mim:

    // 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
fonte
1
using (var stream = new StringWriter ()) pode ser alterado para var stream = new StringWriter (); Dá erro com a análise de código, pois é necessário descartar o xmlwriter duas vezes.
Archna
1
@Archna Se você fizesse isso, o StringWriter não seria descartado caso a chamada XmlWriter.Create gerasse uma exceção. Uma possível solução que cobre autores XmlWriter maliciosos fazendo uma implementação de IDispose que não está em conformidade com a garantia de que a execução de Dispose duas vezes não faz nada para a segunda chamada envolveria um try catch e a configuração de stream para null dentro de using( writer ), como pode ser visto nesta pergunta: stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn
Para que você está usando o parâmetro de tipo T?
Jesper
25

Use a XmlSerializer.Serializesobrecarga do método onde você pode especificar namespaces personalizados e passar isso para lá.

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

passar array nulo ou vazio não resolverá

Kossib
fonte
7
Observe que você precisa combinar esta resposta com a resposta de @tobsen para obter o que eu estava pedindo - um xml realmente limpo!
Grzenio
14

Você pode usar XmlWriterSettings e definir a propriedade OmitXmlDeclaration como true conforme descrito no msdn . Em seguida, use o XmlSerializer.Serialize (xmlWriter, objectToSerialize) conforme descrito aqui .

tobsen
fonte
0

Isso gravará o XML em um arquivo em vez de em uma string. Bilhete de objeto é o objeto que estou serializando.

Namespaces usados:

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
fonte