首页 > 解决方案 > C# XmlTextWriter 无法写入文件

问题描述

我的 XmlTextWriter 类有问题,我无法写入文件。

这是我正在创建的控制台应用程序,功能如下所示。

private void WriteXML()
    {
        Console.WriteLine("Writing");
        using (XmlTextWriter writer = new XmlTextWriter("DataW.xml", System.Text.Encoding.UTF8))
        {
            writer.Formatting = Formatting.Indented;
            writer.WriteStartDocument();
            writer.WriteComment("This is a comment");
            writer.WriteStartElement("WeeklyReview");

            writer.WriteStartElement("DateTime");
            writer.WriteStartAttribute("DateTime","09/04/2018 05:00");
            writer.WriteElementString("Activity", "At Theodor");
            writer.WriteElementString("Social", "Not Theodor,Theodor");
        }
    }

我得到的结果只是一个没有任何内容的文件。在 VS 2017 中,该文件以白色背景显示,其中没有任何内容。

我正在写入的文件位于解决方案资源管理器中,并且与我正在读取的文件位于同一位置(有效)。

标签: c#xml

解决方案


我猜您看到的问题是创建的 XML 文件是空白或不完整的。如果是这样,using请在您的代码周围添加一条语句,如下所示:

using (XmlTextWriter writer = new XmlTextWriter("DataW.xml", System.Text.Encoding.UTF8))
{
    writer.Formatting = Formatting.Indented;
    writer.WriteStartDocument();
    writer.WriteComment("This is a comment");
    writer.WriteStartElement("Weekly Review"); //NB: A space in an element name!

    writer.WriteStartElement("DateTime");
    writer.WriteStartAttribute("09/04/2018 05:00"); //NB: a value given as an attribute name (consider: WriteAttributeString)!
    writer.WriteElementString("Activity", "At Theodor");
    writer.WriteElementString("Social", "Not Theodor,Theodor");
}

问题的原因是您调用写入底层流而不是文件系统的方法。要确保将数据写入文件系统,您需要调用该Flush方法。Flush 在编写器关闭/处置时自动调用(但不是在它完成时)。该using语句确保您writer始终正确处理,因此将确保您的流被刷新到磁盘。

对于任何其他问题,您可能会抛出异常(例如,是否存在写入目标位置的文件访问问题)。如果您收到异常,请分享该消息,我们可以为此推荐解决方案。


附言。下面给出了由此创建的 XML/它不是有效的 XML,因此您将遇到其他问题。我会把这些留给你解决,或者如果你在那里有问题,你可以作为另一个问题提出。同时,您可以从文档中的示例中获得一些提示:https ://docs.microsoft.com/en-us/dotnet/api/system.xml.xmltextwriter.writestartattribute?view=netframework-4.7.2

<?xml version="1.0" encoding="utf-8"?>
<!--This is a comment-->
<Weekly Review>
  <DateTime 09/04/2018 05:00="">
    <Activity>At Theodor</Activity>
    <Social>Not Theodor,Theodor</Social>
  </DateTime>
</Weekly Review>

推荐阅读