How can I make the xmlserializer only serialize plain xml?
Asked Answered
R

4

118

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?

Retreat answered 20/11, 2009 at 17:22 Comment(0)
F
273

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();
    }
}
Flog answered 17/9, 2010 at 2:10 Comment(4)
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.Haggle
@Haggle 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://mcmap.net/q/188928/-disposing-of-object-multiple-times.Writing
What are you using the type-parameter T for?Serin
So the key here is settings.OmitXmlDeclaration = true;. See XmlWriterSettings.OmitXmlDeclaration PropertyRunyon
Q
28

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

Quasar answered 22/11, 2009 at 22:11 Comment(1)
Please note that you need to combine this answer with @tobsen's answer to get what I was asking for - a really clean xml!Retreat
N
16

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.

Norton answered 20/11, 2009 at 17:49 Comment(0)
W
3

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); 
}
Workbench answered 15/7, 2019 at 15:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.