C# XML编写器问题

C# XML编写器问题,c#,.net,xml,xmlwriter,C#,.net,Xml,Xmlwriter,我正在使用XMLWriter创建应用程序中一些重要事件的日志 目前,假设应用程序已正确关闭,则一切正常,但如果未正确关闭,则文件未关闭,日志基本上丢失 让我们假设编写一个简单的元素,如下所示: writer.WriteStartElement(eventName); writer.WriteAttributeString("t", DateTime.Now.ToString()); writer.WriteString(eventBody); writer.WriteEndElement

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

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

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

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

是否有任何方法可以在此时关闭该文件,并在稍后将其余元素追加到该文件中,然后再关闭根元素和xml编写器?

您可以在指令块之后调用writer.Flush()方法。这将写入日志,并且不会丢失任何元素。
XmlWriter
类实现了
IDisposable
接口。这意味着您必须确保在实例上调用
Dispose
方法

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

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

每次都要确保刷新写入程序。

将您的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技巧。

请参阅本页的第一个主题,主要介绍如何保存XML日志文件,而不必担心文件是否打开,也不必担心如何处理结束标记。希望你觉得有用


如果不使用using语句,则需要使用如下函数

yourXmlWriter.Flush();

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


您可以在它之后添加另一个writer.Flush(),然后关闭writer。我的意思是,如果应用程序在刷新之后但在可以写入结束标记之前失败了怎么办?只需添加Flush方法,它就完成了我想要的,基本上它会显示我强制退出应用程序之前的最后一个事件。结果是一个不完整的xml文件,因为根元素标记并没有关闭,但这正是我想要的,因为不完整的xml证明出了一些问题。Thnx请谨慎复制和粘贴此代码。它已经六年了(例如,您不应该使用
XmlTextWriter
),并且在
IDisposable
资源周围缺少
块。链接的重要部分是Xml包含,这是所要求的技巧。我发现即使使用(),也需要Flush(),否则较大的文件会被突然截断。MSDN示例还将Flush()与using()一起使用
yourXmlWriter.Close();