C#:XmlTextWriter.WriteElementString在空字符串上失败?

Roe*_*ler 8 c# xml xmltextwriter writeelementstring

我正在使用XmlTextWriter它的WriteElementString方法,例如:

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

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

writer.Close();
Run Code Online (Sandbox Code Playgroud)

预期的XML输出是:

<User>
    <Username>value</Username>
    <Email>value</Email>
</User>
Run Code Online (Sandbox Code Playgroud)

但是,如果例如inputEmail为空,则得到结果XML,如下所示:

<User>
    <Username>value</Username>
    <Email/>
</User>
Run Code Online (Sandbox Code Playgroud)

而我希望它是:

<User>
    <Username>value</Username>
    <Email></Email>
</User>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?有没有办法以简单的方式使用XmlTextWriter?实现我的预期结果?

Phi*_*ert 20

你的输出是正确的.没有内容的元素应该写成<tag/>.

您可以通过调用WriteFullEndElement()强制使用完整标记

writer.WriteStartElement("Email");
writer.WriteString(inputEmail);
writer.WriteFullEndElement();
Run Code Online (Sandbox Code Playgroud)

<Email></Email>当inputEmail为空时将输出.

如果您想多次执行此操作,可以创建一个扩展方法:

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

然后你的代码将成为:

writer.WriteStartElement("User");
writer.WriteFullElementString("Username", inputUserName);
writer.WriteFullElementString("Email", inputEmail);
writer.WriteEndElement();
Run Code Online (Sandbox Code Playgroud)


RaY*_*ell 5

它不会失败<Tag/>只是一个捷径<Tag></Tag>