Come posso fare in modo che xmlserializer serializzi solo XML normale?


86

Ho bisogno di ottenere un semplice xml, senza <?xml version="1.0" encoding="utf-16"?>all'inizio e xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"nel primo elemento da XmlSerializer. Come posso farlo?

Risposte:


216

Per mettere tutto insieme, questo funziona perfettamente per me:

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

1
using (var stream = new StringWriter ()) può essere modificato in var stream = new StringWriter (); Fornisce un errore con l'analisi del codice poiché cerca di smaltire xmlwriter due volte.
Archna

1
@Archna Se lo facessi, StringWriter non verrebbe eliminato nel caso in cui la chiamata XmlWriter.Create generi un'eccezione. Una possibile soluzione che copre gli autori dannosi di XmlWriter che realizzano un'implementazione di IDispose che non è conforme alla garanzia che l'esecuzione di Dispose due volte non fa nulla per la seconda chiamata comporterebbe un tentativo di cattura e l'impostazione del flusso su null all'interno di using( writer ), come si può vedere in questa domanda: stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn

Per cosa stai usando il parametro di tipo T?
Jesper

25

Usa l' XmlSerializer.Serializeoverload del metodo in cui puoi specificare spazi dei nomi personalizzati e passarci questo.

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

passare un array nullo o vuoto non farà il trucco


7
Tieni presente che devi combinare questa risposta con la risposta di @ tobsen per ottenere ciò che stavo chiedendo: un xml davvero pulito!
Grzenio


0

Questo scriverà l'XML in un file invece che in una stringa. Il ticket oggetto è l'oggetto che sto serializzando.

Spazi dei nomi utilizzati:

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

Codice:

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); 
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.