Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XML serialization force full closing tag on null or empty value

I have class

public class Testowa
{
    public string test { get; set; }
}

When I serialize it without value for test, I get

<test/>

But I want get

<test></test>

How I can do it?

like image 360
pepeb333 Avatar asked Nov 04 '16 12:11

pepeb333


2 Answers

If you don't wont use FileStream, you may use StringBuilder. XmlWriterEE class from Fab post.

    public static string SerializeObject(this object obj)
    {
        var settings = new XmlWriterSettings
        {
            Encoding = Encoding.GetEncoding("ISO-8859-1"),
            NewLineChars = Environment.NewLine,
            ConformanceLevel = ConformanceLevel.Auto,
            OmitXmlDeclaration = true,
            WriteEndDocumentOnClose = true,
            Indent = true
        };           

        var stream = new StringBuilder();

        using (var writer = XmlWriter.Create(stream, settings))
        {
            var xmlSerializer = new XmlSerializer(obj.GetType());
            var namespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
            xmlSerializer.Serialize(new XmlWriterEE(writer), obj, namespaces);                
        }
        return stream.ToString();
    }
like image 85
Taurusfk Avatar answered Oct 27 '22 18:10

Taurusfk


Extend XmlWriter

From there,

If you use a code similar to the following for your serialization:

XmlSerializer s = new XmlSerializer(typeof(Testowa));
using (FileStream fs = new FileStream(File, FileMode.CreateNew))
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Encoding = Encoding.GetEncoding("ISO-8859-1");
    settings.NewLineChars = Environment.NewLine;
    settings.ConformanceLevel = ConformanceLevel.Document;
    settings.Indent = true;
    using (XmlWriter writer = XmlWriter.Create(fs, settings))
    {
        s.Serialize(writer, this);
    }
}

Replace the last line with a derived version of XmlWriter which will force the serialization of full closing tags:

s.Serialize(new XmlWriterEE(writer), this);

The full XmlWriter derived class:

public class XmlWriterEE :  XmlWriter
{
    private XmlWriter baseWriter;

    public XmlWriterEE(XmlWriter w)
    {
        baseWriter = w;
    }

    //Force WriteEndElement to use WriteFullEndElement
    public override void WriteEndElement() {baseWriter.WriteFullEndElement(); }

    public override void WriteFullEndElement()
    {
        baseWriter.WriteFullEndElement();
    }

    public override void Close()
    {
        baseWriter.Close();
    }

    public override void Flush()
    {
        baseWriter.Flush();
    }

    public override string LookupPrefix(string ns)
    {
        return (baseWriter.LookupPrefix(ns));
    }

    public override void WriteBase64(byte[] buffer, int index, int count)
    {
        baseWriter.WriteBase64(buffer, index, count);
    }

    public override void WriteCData(string text)
    {
        baseWriter.WriteCData(text);
    }

    public override void WriteCharEntity(char ch)
    {
        baseWriter.WriteCharEntity(ch);
    }

    public override void WriteChars(char[] buffer, int index, int count)
    {
        baseWriter.WriteChars(buffer, index, count);
    }

    public override void WriteComment(string text)
    {
        baseWriter.WriteComment(text);
    }

    public override void WriteDocType(string name, string pubid, string sysid, string subset)
    {
        baseWriter.WriteDocType(name, pubid, sysid, subset);
    }

    public override void WriteEndAttribute()
    {
        baseWriter.WriteEndAttribute();
    }

    public override void WriteEndDocument()
    {
        baseWriter.WriteEndDocument();
    }

    public override void WriteEntityRef(string name)
    {
        baseWriter.WriteEntityRef(name);
    }

    public override void WriteProcessingInstruction(string name, string text)
    {
        baseWriter.WriteProcessingInstruction(name, text);
    }

    public override void WriteRaw(string data)
    {
        baseWriter.WriteRaw(data);
    }

    public override void WriteRaw(char[] buffer, int index, int count)
    {
        baseWriter.WriteRaw(buffer, index, count);
    }

    public override void WriteStartAttribute(string prefix, string localName, string ns)
    {
        baseWriter.WriteStartAttribute(prefix, localName, ns);
    }

    public override void WriteStartDocument(bool standalone)
    {
        baseWriter.WriteStartDocument(standalone);
    }

    public override void WriteStartDocument()
    {
        baseWriter.WriteStartDocument();
    }

    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        baseWriter.WriteStartElement(prefix, localName, ns);
    }

    public override WriteState WriteState
    {
        get { return baseWriter.WriteState; }
    }

    public override void WriteString(string text)
    {
        baseWriter.WriteString(text);
    }

    public override void WriteSurrogateCharEntity(char lowChar, char highChar)
    {
        baseWriter.WriteSurrogateCharEntity(lowChar, highChar);
    }

    public override void WriteWhitespace(string ws)
    {
        baseWriter.WriteWhitespace(ws);
    }
}
like image 41
Fab Avatar answered Oct 27 '22 19:10

Fab