我正在使用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输出是:
<User>
<Username>value</Username>
<Email>value</Email>
</User>
但是,如果例如inputEmail为空,则结果XML如下所示:
<User>
<Username>value</Username>
<Email/>
</User>
我希望它是:
<User>
<Username>value</Username>
<Email></Email>
</User>
我做错了什么?有没有办法使用XmlTextWriter
以简单的方式实现我的预期结果?
答案 0 :(得分:20)
您的输出是正确的。没有内容的元素应写为<tag/>
。
您可以通过调用WriteFullEndElement()
强制使用完整标记writer.WriteStartElement("Email");
writer.WriteString(inputEmail);
writer.WriteFullEndElement();
当inputEmail为空时,输出<Email></Email>
。
如果您想多次执行此操作,可以创建一个扩展方法:
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();
答案 1 :(得分:4)
它没有失败<Tag/>
只是<Tag></Tag>
答案 2 :(得分:2)
您的代码应为:
using (XmlWriter writer = XmlWriter.Create("filename.xml"))
{
writer.WriteStartElement("User");
writer.WriteElementString("Username", inputUserName);
writer.WriteElementString("Email", inputEmail);
writer.WriteEndElement();
}
这可以避免在异常情况下资源泄漏,并使用正确的方法创建XmlReader(自.NET 2.0起)。
答案 3 :(得分: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 。< / p>
或者您也可以使用
w.Formatting = Formatting.Indented;
而不是添加XmlWriterSettings。