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

时间:2009-07-24 07:18:47

标签: 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();

预期的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 个答案:

答案 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。