【问题标题】:XML Writer questionXML 编写器问题
【发布时间】:2016-10-19 19:18:49
【问题描述】:

我正在使用 XML Writer 在我的应用程序中创建一些重要事件的日志。

目前一切正常,假设应用程序已正确关闭,但如果未正确关闭,则文件未关闭,日志基本丢失。

让我们假设编写一个简单的元素,如下所示:

 writer.WriteStartElement(eventName);
 writer.WriteAttributeString("t", DateTime.Now.ToString());
 writer.WriteString(eventBody);
 writer.WriteEndElement();

此时有什么方法可以关闭文件并稍后将剩余元素附加到文件中,然后才关闭根元素和 xml 编写器?

【问题讨论】:

    标签: c# .net xml xmlwriter


    【解决方案1】:

    您可以在指令块之后调用方法 writer.Flush()。这应该会写入日志,并且您不会丢失任何元素。

    【讨论】:

    • 您可以在其后添加另一个 writer.Flush() 然后关闭 writer。
    • 我的意思是,如果应用程序在刷新之后但在可以写入结束标记之前失败怎么办?
    • 刚刚添加了flush方法,它做了我想要的,基本上它显示了我强行退出应用程序之前的最后一个事件。结果是一个不完整的 xml 文件,因为根元素标签没有关闭,但这是我想要的,因为不完整的 xml 证明出了点问题。谢谢
    【解决方案2】:

    XmlWriter 类实现了IDisposable 接口。这意味着您必须确保在您的实例上调用 Dispose 方法。

    此外,您应该在XmLWriterSettings.ConformanceLevel 看到示例。它展示了如何创建一个XmlWriter,这可以用于编写片段。您可以编写每个元素一个日志条目的文档:

    <SomeEvent t="20100228T134000Z">text</SomeEvent>
    <SomeOtherEvent t="20100228T134100Z">text</SomeOtherEvent>
    

    请务必在每次之后刷新写入器。

    【讨论】:

      【解决方案3】:

      将您的 XmlWriter 放在 using 语句中;

          using (XmlWriter writer = XmlWriter.Create(stream))
          {
              writer.WriteStartElement("logentry");
              writer.WriteAttributeString("t", DateTime.Now.ToString());
              writer.WriteString("Something to log.");
              writer.WriteEndElement();
          }
      

      您可能还需要做一些 XmlDocumentFragment 技巧。

      【讨论】:

        【解决方案4】:

        参见本页的第一个主题,基本上展示了如何保留 XML 日志文件,而不用担心保持文件打开,也不必担心如何处理结束标记。希望对您有用。

        http://msdn.microsoft.com/en-us/library/aa302289.aspx

        【讨论】:

        • 小心复制和粘贴此代码。它已有六年历史(例如,您不应该使用 XmlTextWriter),并且缺少 using 块周围的 IDisposable 资源。
        • 链接的重要部分是 Xml 包含,这是所要求的技巧。
        【解决方案5】:

        如果不使用using语句,则需要使用类似

        的函数
        yourXmlWriter.Flush();
        

        yourXmlWriter.Close();
        

        您的数据仍在缓冲区中,您需要写入底层流。 (可以是文件或任何流...)

        https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter(v=vs.110).aspx

        【讨论】:

        • 我发现即使使用 using() 也需要 Flush(),否则较大的文件会被突然截断。 MSDN 示例也使用 Flush() 和 using()
        猜你喜欢
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多