Wie kann ich dafür sorgen, dass der xmlserializer nur einfache XML-Dateien serialisiert?

83

Ich muss einfaches XML bekommen, ohne das <?xml version="1.0" encoding="utf-16"?>am Anfang und xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"im ersten Element von XmlSerializer. Wie kann ich es tun?

Grzenio
quelle

Antworten:

205

Alles zusammen - das funktioniert perfekt für mich:

    // 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
quelle
1
using (var stream = new StringWriter ()) kann in var stream = new StringWriter () geändert werden. Gibt Fehler bei der Code-Analyse aus, da xmlwriter zweimal entsorgt werden muss.
Archna
1
@Archna Wenn Sie dies tun, wird der StringWriter nicht entsorgt, wenn der Aufruf von XmlWriter.Create eine Ausnahme auslöst. Eine mögliche Lösung, die böswillige XmlWriter-Autoren abdeckt, die eine IDispose-Implementierung erstellen, die nicht der Garantie entspricht, dass die zweimalige Ausführung von Dispose nichts für den zweiten Aufruf bewirkt, würde einen Versuch beinhalten, den Stream innerhalb von zu fangen und auf null zu setzen using( writer ), wie in dieser Frage zu sehen ist: stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn
Wofür verwenden Sie den Typparameter T?
Jesper
25

Verwenden Sie die XmlSerializer.SerializeMethodenüberladung, bei der Sie benutzerdefinierte Namespaces angeben und diese übergeben können.

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

Das Übergeben von null oder eines leeren Arrays reicht nicht aus

Kossib
quelle
7
Bitte beachten Sie, dass Sie diese Antwort mit der Antwort von @ tobsen kombinieren müssen, um das zu erhalten, wonach ich gefragt habe - eine wirklich saubere XML!
Grzenio
14

Sie können XmlWriterSettings verwenden und die Eigenschaft OmitXmlDeclaration auf true setzen, wie in der msdn beschrieben . Verwenden Sie dann den XmlSerializer.Serialize (xmlWriter, objectToSerialize) wie hier beschrieben .

tobsen
quelle
0

Dadurch wird das XML in eine Datei anstelle einer Zeichenfolge geschrieben. Objektticket ist das Objekt, das ich serialisiere.

Verwendete Namespaces:

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

Code:

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
quelle