views:

125

answers:

2

The file format I'm working with (OFX) is XML-like and contains a bunch of plain-text stuff before the XML-like bit begins. It doesn't like having between the plain-text and XML parts though, so I'm wondering if there's a way to get XmlSerialiser to ignore that. I know I could go through the file and wipe out that line but it would be simpler and cleaner to not write it in the first place! Any ideas?

+6  A: 

You'll have to manipulate the XML writer object you use when calling the Serialize method. Its Settings property has a OmitXmlDeclaration property, which you'll want to set to true. You'll also need to set the ConformanceLevel property, otherwise the XmlWriter will ignore the OmitXmlDeclaration property.

XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlWriter writer = XmlWriter.Create(/*whatever stream you need*/,settings);
serializer.Serialize(writer,objectToSerialize);
writer.close();
Welbog
Apologies; turns out that the ConformanceLevel part makes serializer.Serialize throw an exception. So I've yanked that 'accept' out from under you! :) You still get an upvote, of course, and a 'thank you'!
Ben Hymers
+4  A: 

Not too tough, you just have to serialize to an explicitly declared XmlWriter and set the options on that writer before you serialize.

public static string SerializeExplicit(SomeObject obj)
{    
    XmlWriterSettings settings;
    settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;

    XmlSerializerNamespaces ns;
    ns = new XmlSerializerNamespaces();
    ns.Add("", "");


    XmlSerializer serializer;
    serializer = new XmlSerializer(typeof(SomeObject));

    //Or, you can pass a stream in to this function and serialize to it.
    // or a file, or whatever - this just returns the string for demo purposes.
    StringBuilder sb = new StringBuilder();
    using(var xwriter = XmlWriter.Create(sb, settings))
    {

        serializer.Serialize(xwriter, obj, ns);
        return sb.ToString();
    }
}
Philip Rieck