简体   繁体   中英

How to serialize a XML without unnecessary spaces and line breaks? (.NET)

I'm using XmlSerializer.Serialize , and it produces line breaks and unnecessary spaces. How to avoid it?

Perhaps you could use the overload accepting an XmlWriter , and configure the given XmlWriter with an XmlWriterSettings instance?

XmlWriterSettings allows you to control the application of line breaks and indentation.

void Serialize(Object o)
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = false;
    settings.NewLineHandling = NewLineHandling.None;
    //settings.OtherProperties = values;

    using (XmlWriter writer = XmlWriter.Create(CreateStream(), settings))
    {
        _serializer.Serialize(writer, o);
    }
}

It's interesting, I thought there was no formatting by default. I just tried the following and got no formatting:

using (var stream = new MemoryStream())
{
    System.Text.Encoding encoding;
    using (var writer = XmlWriter.Create(stream))
    {
        if (writer == null)
        {
            throw new InvalidOperationException("writer is null");
        }

        encoding = writer.Settings.Encoding;
        var ser = new XmlSerializer(obj.GetType());
        ser.Serialize(writer, obj);
    }

    stream.Position = 0;
    using (var reader = new StreamReader(stream, encoding, true))
    {
        return reader.ReadToEnd();
    }
}

in a sample run, it returned the following XML:

<?xml version="1.0" encoding="utf-8"?><obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><childOne /><childTwo /><text>text1</text><text>text2</text></obj>

Please also check if serialized classes contain members of XML-type (like XmlElement). I used Xsd2Code tool to generate classes from XSD and (in very special case) it has created a member of type XmlElement. During serialization this member had its own formatting (identation to be exact). Even if I had turned on (or off) XmlSerializer indentation it had no affect on the XmlElement member.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM