Jak mogę sprawić, by xmlserializer serializował tylko zwykły plik XML?

85

Muszę pobrać zwykły xml, bez <?xml version="1.0" encoding="utf-16"?>na początku iw xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"pierwszym elemencie z XmlSerializer. Jak mogę to zrobić?

Grzenio
źródło

Odpowiedzi:

211

Podsumowując - to działa idealnie dla mnie:

    // 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
źródło
1
using (var stream = new StringWriter ()) można zmienić na var stream = new StringWriter (); Daje błąd podczas analizy kodu, ponieważ wymaga dwukrotnego usunięcia xmlwriter.
Archna
1
@Archna Jeśli to zrobiłeś, StringWriter nie zostanie usunięty w przypadku, gdy wywołanie XmlWriter.Create zgłosi wyjątek. Możliwe rozwiązanie, które obejmuje złośliwych autorów XmlWriter tworzących implementację IDispose, która nie jest zgodna z gwarancją, że dwukrotne wykonanie Dispose nie robi nic dla drugiego wywołania, obejmowałoby próbę przechwycenia i ustawienie strumienia na null wewnątrz using( writer ), jak widać w tym pytaniu: stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn
Do czego używasz parametru typu T?
Jesper,
25

Użyj XmlSerializer.Serializeprzeciążenia metody, w którym możesz określić niestandardowe przestrzenie nazw i przekazać je do tego.

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

przekazanie wartości null lub pustej tablicy nie załatwi sprawy

kossib
źródło
7
Pamiętaj, że musisz połączyć tę odpowiedź z odpowiedzią @ tobsen, aby uzyskać to, o co prosiłem - naprawdę czysty XML!
Grzenio
0

Spowoduje to zapisanie XML do pliku zamiast ciągu. Bilet obiektu to obiekt, który serializuję.

Używane przestrzenie nazw:

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

Kod:

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
źródło