代码之家  ›  专栏  ›  技术社区  ›  Roee Adler

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

  •  8
  • Roee Adler  · 技术社区  · 17 年前

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

    <User>
        <Username>value</Username>
        <Email/>
    </User>
    

    鉴于我希望它是:

    <User>
        <Username>value</Username>
        <Email></Email>
    </User>
    

    我做错了什么?有没有一种方法可以通过使用 XmlTextWriter ?

    4 回复  |  直到 17 年前
        1
  •  22
  •   Philippe Leybaert    17 年前

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

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

    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();
    
        2
  •  5
  •   RaYell    17 年前

    它没有失败 <Tag/> 这只是一条捷径 <Tag></Tag>

        3
  •  2
  •   John Saunders    17 年前

    您的代码应该是:

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

    这避免了异常情况下的资源泄漏,并使用正确的方法创建XmlReader(自.NET 2.0以来)。

        4
  •  0
  •   Sasikumar Murugesan    7 年前

    把这个留在这里,以防有人需要它;因为上面的答案没有一个能帮我解决这个问题,或者看起来有点过分了。

    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 .