XML-Datei erweitern statt neu erstellen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    XML-Datei erweitern statt neu erstellen

    Hallo Leute,

    mit folgendem Code speichere ich seit Jahren diverse ObservableCollection(Of T) ab. Das funktioniert auch problemlos.

    VB.NET-Quellcode

    1. Public Sub XML_schreiben(Of T)(Datei_XML As String, Coll As ObservableCollection(Of T))
    2. Dim Seriendings = New XmlSerializer(GetType(ObservableCollection(Of T)))
    3. Using Schreiber = New IO.StreamWriter(Datei_XML)
    4. Seriendings.Serialize(Schreiber, Coll)
    5. End Using
    6. End Sub


    Dabei wird aber die gesamte Collection immer komplett neu geschrieben. Aktuell würde ich gern ein Logfile anlegen und bei jeder Aktion ein Item an die Datei anhängen, statt immer alles neu zu schreiben. Die folgende Änderung funktioniert leider nicht.

    VB.NET-Quellcode

    1. Using Schreiber = New IO.StreamWriter(Datei_XML, TRUE)


    Auch eine 2. Sub, der nur ein Item vom passenden Typ übergeben wird ergänzt die XML-Datei nicht, sondern sorgt nur für Datenmüll.

    VB.NET-Quellcode

    1. Public Sub XML_schreiben(Of T)(Datei_XML As String, ByRef meinItem As T, Optional Append As Boolean = False)
    2. Dim Seriendings = New XmlSerializer(GetType(T))
    3. Using Schreiber = New IO.StreamWriter(Datei_XML, Append)
    4. Seriendings.Serialize(Schreiber, meinItem)
    5. End Using
    6. End Sub


    Hat einer nen Tipp, wie man sowas macht? Und ist es überhaupt sinnvoll, oder ist es von der Geschwindigkeit her unnötig? Die aktuellen Log-Dateien sind so etwa 1-2MB groß.

    Gruß
    eddi
    xml eignet sich nicht für logfiles.
    gültiges xml hat immer einen definierten Anfang und ein definiertes, dem Anfang entsprechendes Ende.
    Folglich kannste am Ende einer xml-datei nicht einfach was anhängen, weil der Anhang wäre dann hinter das Ende geschrieben und damit wäre die xml-Datei ungültig.

    Bei Logfiles will man aber genau das: einfach am Ende was anhängen können.
    Daher nimmmt man für Logfiles üblicherweise csv.
    In der Praxis sogar oft ein besonders unstrukturiertes csv, etwa wo die Zeilen verschieden viele Spalten haben und so Scherze.

    Aber vlt irre ich mich auch,und es gibt inzwischen besondere XmlWriter, die eine Xml-Datei verlängern können, ohne sie neu zu schreiben.
    Ich habe mal so etwas mit einem einfachen "Text-file" gemacht.
    Für meine damalige kleine Anwendung hat das super funktioniert. :)

    Aus verschiedenen Bereichen der App wurden dann Eintragungen ins "logfile" geschrieben.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Friend MyLogFile As String
    2. Friend Sub LogFileDatum()
    3. Dim LogDatum As String = Date.Now.ToString("MM.yyyy")
    4. MyLogFile = "Logfile_" & LogDatum & ".txt"
    5. End Sub
    6. Friend Sub ExceptionToFile(ByVal ExceptionMessage As String)
    7. LogFileDatum()
    8. Dim DatumImLogfile As String = Date.Now.ToString("dd.MM.yyyy|HH.mm")
    9. File.AppendAllText(MyLogFile, DatumImLogfile & " - " & ExceptionMessage & Environment.NewLine)
    10. End Sub
    11. Friend Sub Fehlerbehandlung()
    12. If MessageBox.Show(MyLanguage.error_msgbox, MyLanguage.msgbox_headline, MessageBoxButtons.YesNo, MessageBoxIcon.Information) = DialogResult.Yes Then
    13. ExceptionToFile(MyLanguage.error_newstart)
    14. System.Diagnostics.Process.Start(MyLogFile)
    15. Abort = True
    16. Threading.Thread.Sleep(8000)
    17. Application.Restart()
    18. Else
    19. Abort = True
    20. ExceptionToFile(MyLanguage.error_close)
    21. Application.Exit()
    22. End If
    23. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: