Search code examples
c#xmlxmltextwriterwriteelementstring

C#: XmlTextWriter.WriteElementString fails on empty strings?


I'm using XmlTextWriter and its WriteElementString method, for example:

XmlTextWriter writer = new XmlTextWriter("filename.xml", null);

writer.WriteStartElement("User");
writer.WriteElementString("Username", inputUserName);
writer.WriteElementString("Email", inputEmail);
writer.WriteEndElement();

writer.Close();

The expected XML output is:

<User>
    <Username>value</Username>
    <Email>value</Email>
</User>

However, if for example inputEmail is empty, the result XML I get as as follows:

<User>
    <Username>value</Username>
    <Email/>
</User>

Whereas I would expect it to be:

<User>
    <Username>value</Username>
    <Email></Email>
</User>

What am I doing wrong? Is there a way to achieve my expected result in a simple way using XmlTextWriter?


Solution

  • Your output is correct. An element with no content should be written as <tag/>.

    You can force the use of the full tag by calling WriteFullEndElement()

    writer.WriteStartElement("Email");
    writer.WriteString(inputEmail);
    writer.WriteFullEndElement();
    

    That will output <Email></Email> when inputEmail is empty.

    If you want to do that more than once, you could create an extension method:

    public static void WriteFullElementString(this XmlTextWriter writer,
                                              string localName, 
                                              string value)
    {
        writer.WriteStartElement(localName);
        writer.WriteString(value);
        writer.WriteFullEndElement();
    }
    

    Then your code would become:

    writer.WriteStartElement("User");
    writer.WriteFullElementString("Username", inputUserName);
    writer.WriteFullElementString("Email", inputEmail);
    writer.WriteEndElement();