97

I need to get plain xml, without the <?xml version="1.0" encoding="utf-16"?> at the beginning and xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" in first element from XmlSerializer. How can I do it?

alexandrul
  • 12,166
  • 11
  • 71
  • 98
Grzenio
  • 34,674
  • 45
  • 154
  • 233

4 Answers4

237

To put this all together - this works perfectly for me:

    // 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();
        }
    }
KOGI
  • 3,889
  • 2
  • 23
  • 34
Simon Sanderson
  • 2,671
  • 2
  • 18
  • 11
  • 1
    using (var stream = new StringWriter()) can be changed to var stream = new StringWriter(); Gives error with code analysis as it tres to dispose xmlwriter twice. – Archna Nov 03 '16 at 21:47
  • 1
    @Archna If you did that, the StringWriter would not be disposed in the case that the XmlWriter.Create call throws an exception. A possible solution that covers malicious XmlWriter authors making an IDispose implementation that does not conform to the guarantee that executing Dispose twice does nothing for the second call would involve a try catch and setting stream to null inside the `using( writer )`, as can be seen in this question: https://stackoverflow.com/a/11192524/2144408. – TamaMcGlinn Oct 18 '18 at 10:26
  • What are you using the type-parameter T for? – Jesper Dec 11 '19 at 18:01
27

Use the XmlSerializer.Serialize method overload where you can specify custom namespaces and pass there this.

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

passing null or empty array won't do the trick

kossib
  • 480
  • 3
  • 4
  • 8
    Please note that you need to combine this answer with @tobsen's answer to get what I was asking for - a really clean xml! – Grzenio Nov 23 '09 at 11:00
15

You can use XmlWriterSettings and set the property OmitXmlDeclaration to true as described in the msdn. Then use the XmlSerializer.Serialize(xmlWriter, objectToSerialize) as described here.

Chris
  • 3,291
  • 1
  • 24
  • 40
tobsen
  • 5,298
  • 3
  • 32
  • 49
1

This will write the XML to a file instead of a string. Object ticket is the object that I am serializing.

Namespaces used:

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
  • 796
  • 6
  • 10