Pergunta

Estou usando o XML Writer para criar um log de alguns eventos importantes no meu aplicativo.

Atualmente, tudo funciona bem, assumindo que o aplicativo está fechado corretamente, mas se não estiver, o arquivo não está fechado e o log será basicamente perdido.

Vamos supor a escrita de um elemento simples, algo assim:

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

Existe alguma maneira de fechar o arquivo neste momento e anexar os elementos restantes mais tarde e só depois fechar o elemento raiz e o XML Writer?

Foi útil?

Solução

Você pode chamar o método writer.flush () após o seu bloco de instruções. Isso deve escrever o log e você não perderá nenhum elemento.

Outras dicas

o XmlWriter A classe implementa o IDisposable interface. Isso significa que você deve garantir que o Dispose O método é chamado em sua instância.

Além disso, você deve ver o exemplo em XmLWriterSettings.ConformanceLevel. Mostra como criar um XmlWriter O que é bom em escrever um fragmento. Você pode escrever um documento com uma entrada de log por elemento:

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

Apenas certifique -se de liberar o escritor após cada um.

Coloque seu XMLWriter em uma instrução Using;

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

Você provavelmente terá que fazer alguns truques xmldocumentfragment também.

Consulte o primeiro tópico nesta página, basicamente mostra como manter um arquivo de log XML sem se preocupar em manter o arquivo aberto e sem se preocupar com o que fazer com a tag de fechamento também. Espero que você ache isso útil.

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

Se você não usar a instrução usando, precisa usar uma função como

yourXmlWriter.Flush();

ou

yourXmlWriter.Close();

Seus dados ainda estão no buffer e você precisa escrever para o fluxo subjacente. (Pode ser um arquivo ou qualquer fluxo ...)

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top