XML Writer вопрос - PullRequest
       19

XML Writer вопрос

3 голосов
/ 28 февраля 2010

Я использую XML Writer для создания журнала некоторых важных событий в моем приложении.

В настоящее время все работает нормально, при условии, что приложение правильно закрыто, но если это не так, файл не закрывается и журнал в основном теряется.

Давайте предположим, что написание простого элемента, что-то вроде этого:

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

Есть ли способ закрыть файл на этом этапе и добавить к нему оставшиеся элементы позже, и только затем закрывать корневой элемент и средство записи xml?

Ответы [ 5 ]

3 голосов
/ 28 февраля 2010

Вы можете вызвать метод writer.Flush () после вашего блока инструкций. Это должно написать журнал, и вы не потеряете ни одного элемента.

1 голос
/ 28 февраля 2010

См. Первую тему на этой странице, в основном показывает, как сохранить файл журнала XML, не беспокоясь о том, чтобы сохранить файл открытым, и не беспокоясь о том, что делать с закрывающим тегом. Надеюсь, вы найдете это полезным.

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

1 голос
/ 28 февраля 2010

Поместите ваш XmlWriter в оператор использования;

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

Возможно, вам также придется выполнить некоторые трюки с XmlDocumentFragment.

1 голос
/ 28 февраля 2010

Класс XmlWriter реализует интерфейс IDisposable. Это означает, что вы должны убедиться, что в вашем экземпляре вызывается метод Dispose.

Кроме того, вы должны увидеть пример на XmLWriterSettings.ConformanceLevel. Он показывает, как создать XmlWriter, который подходит для записи фрагмента. Вы можете написать документ с одной записью в журнале на элемент:

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

Просто обязательно промывайте писателя после каждого.

0 голосов
/ 19 октября 2016

Если вы не используете оператор using, вам нужно использовать такую ​​функцию, как

yourXmlWriter.Flush();

или

yourXmlWriter.Close();

Ваши данные все еще находятся в буфере, и вам нужно записать в основной поток. (Может быть файл или любой поток ...)

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

...