9

我正在使用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

4

4 回答 4

22

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

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

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

这将<Email></Email>在 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();
于 2009-07-24T07:22:09.410 回答
5

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

于 2009-07-24T07:21:39.567 回答
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 开始)。

于 2009-07-24T13:22:50.873 回答
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.

于 2015-09-09T07:56:01.957 回答