C#: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(); 

预期的XML输出是:

  value value  

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

  value   

而我希望它是:

  value   

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

你的输出是正确的。 没有内容的元素应该写为

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

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

当inputEmail为空时,将输出

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

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

然后你的代码将成为:

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

它不会失败只是的快捷方式

你的代码应该是:

 using (XmlWriter writer = XmlWriter.Create("filename.xml")) { writer.WriteStartElement("User"); writer.WriteElementString("Username", inputUserName); writer.WriteElementString("Email", inputEmail); writer.WriteEndElement(); } 

这可以避免在exception情况下资源泄漏,并使用正确的方法创建XmlReader(自.NET 2.0起)。

离开这里,万一有人需要它; 因为上面的答案都没有为我解决,或者看起来有点矫枉过正。

  FileStream fs = new FileStream("file.xml", FileMode.Create); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; XmlWriter w = XmlWriter.Create(fs, settings); w.WriteStartDocument(); w.WriteStartElement("tag1"); w.WriteStartElement("tag2"); w.WriteAttributeString("attr1", "val1"); w.WriteAttributeString("attr2", "val2"); w.WriteFullEndElement(); w.WriteEndElement(); w.WriteEndDocument(); w.Flush(); fs.Close(); 

诀窍是设置XmlWriterSettings.Indent = true并将其添加到XmlWriter

编辑:

或者你也可以使用

 w.Formatting = Formatting.Indented; 

而不是添加XmlWriterSettings。