Comment puis-je faire en sorte que le xmlserializer ne sérialise que du XML brut?

85

J'ai besoin d'obtenir du XML brut, sans le <?xml version="1.0" encoding="utf-16"?>au début et xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"dans le premier élément de XmlSerializer. Comment puis-je le faire?

Grzenio
la source

Réponses:

211

Pour mettre tout cela ensemble - cela fonctionne parfaitement pour moi:

    // 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
la source
1
using (var stream = new StringWriter ()) peut être changé en var stream = new StringWriter (); Donne une erreur avec l'analyse de code car il est impossible de supprimer xmlwriter deux fois.
Archna
1
@Archna Si vous faisiez cela, le StringWriter ne serait pas supprimé dans le cas où l'appel XmlWriter.Create lève une exception. Une solution possible qui couvre les auteurs XmlWriter malveillants faisant une implémentation IDispose qui n'est pas conforme à la garantie que l'exécution de Dispose deux fois ne fait rien pour le deuxième appel impliquerait une capture d'essai et la définition de stream sur null dans le using( writer ), comme on peut le voir dans cette question: stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn
Pourquoi utilisez-vous le paramètre de type T?
Jesper
25

Utilisez la XmlSerializer.Serializesurcharge de méthode où vous pouvez spécifier des espaces de noms personnalisés et y passer ceci.

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

passer un tableau nul ou vide ne fera pas l'affaire

kossib
la source
7
Veuillez noter que vous devez combiner cette réponse avec la réponse de @ tobsen pour obtenir ce que je demandais - un XML vraiment propre!
Grzenio
14

Vous pouvez utiliser XmlWriterSettings et définir la propriété OmitXmlDeclaration sur true comme décrit dans le msdn . Utilisez ensuite XmlSerializer.Serialize (xmlWriter, objectToSerialize) comme décrit ici .

tobsen
la source
0

Cela écrira le XML dans un fichier au lieu d'une chaîne. Le ticket d'objet est l'objet que je sérialise.

Espaces de noms utilisés:

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
la source