Domanda
sto usando Writer XML per creare un log di alcuni eventi importanti nella mia applicazione.
Al momento tutto funziona benissimo partendo dal presupposto che l'applicazione è chiuso correttamente, ma se isnt, il file non sia chiuso e il registro è fondamentalmente perso.
Supponiamo la scrittura di un elemento semplice, qualcosa di simile a questo:
writer.WriteStartElement(eventName);
writer.WriteAttributeString("t", DateTime.Now.ToString());
writer.WriteString(eventBody);
writer.WriteEndElement();
C'è un modo per chiudere il file a questo punto e aggiungere i restanti elementi in un secondo momento e solo allora di chiudere l'elemento radice e xml scrittore?
Soluzione
È possibile chiamare il metodo writer.Flush () dopo che il blocco di istruzioni. Questo dovrebbe scrivere il log e non si perde alcun elemento.
Altri suggerimenti
La classe XmlWriter
implementa l'interfaccia IDisposable
. Ciò significa che è necessario assicurarsi che il metodo Dispose
viene chiamato su propria istanza.
Inoltre, si dovrebbe vedere l'esempio a XmLWriterSettings.ConformanceLevel
. Essa mostra come creare un XmlWriter
che è ok con la scrittura di un frammento. È possibile scrivere un documento con una voce di registro per elemento:
<SomeEvent t="20100228T134000Z">text</SomeEvent>
<SomeOtherEvent t="20100228T134100Z">text</SomeOtherEvent>
Basta essere sicuri di svuotare lo scrittore dopo ogni.
Metti la tua XmlWriter in un'istruzione using;
using (XmlWriter writer = XmlWriter.Create(stream))
{
writer.WriteStartElement("logentry");
writer.WriteAttributeString("t", DateTime.Now.ToString());
writer.WriteString("Something to log.");
writer.WriteEndElement();
}
Probabilmente dovrete fare alcuni trucchi XmlDocumentFragment anche.
Si veda il primo argomento in questa pagina, mostra praticamente come mantenere un file di registro XML, senza preoccuparsi di mantenere il file aperto, e senza preoccuparsi di cosa fare con il tag di chiusura troppo. Spero vi sia utile.
Se non si utilizza l'istruzione using, è necessario utilizzare una funzione come
yourXmlWriter.Flush();
o
yourXmlWriter.Close();
I tuoi dati sono ancora nel buffer ed è necessario scrivere nel flusso sottostante. (Potrebbe essere un file o qualsiasi flusso ...)
https: // msdn .microsoft.com / en-us / library / System.Xml.XmlWriter (v = vs.110) aspx