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?

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

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


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


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); 
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.