Pergunta XML do Writer
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?
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.
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