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?

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

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


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


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); 
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.