Einstellungen in externer Datei speichern und laden (.ini, .xml)

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Naifu.

    Einstellungen in externer Datei speichern und laden (.ini, .xml)

    Hay how,

    ich versuche mich inzwischen schon 1-2 Wochen mit folgender Thematik doch im "www" hab ich zwar viel darüber gefunden (Serialisierung) aber nichts, dass mir letztlich geholfen hat (z.B. die Microsoft Erklärung), drum wende ich mich an euch ;-).

    folgendes Beispiel habe ich versucht auf mein Programm abzuändern aber wenn ich das korrekt erkannt hab ist dies nur ein Beispiel für eine Konsolen Ausgabe, aber es wird nichtmal die .xml Datei erstellt?! (den Auslese-Abschnitt (XML-Reader) hab ich noch nicht angepasst gehabt, da nicht mal die .xml Datei erstellt wurde.)

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub XMLWriter()
    3. ' Auswahl einer Kodierungsart für die Zeichenablage
    4. Dim enc As New System.Text.UnicodeEncoding
    5. ' XmlTextWriter-Objekt für unsere Ausgabedatei erzeugen:
    6. Dim XMLobj As Xml.XmlTextWriter _
    7. = New Xml.XmlTextWriter("settings.xml", enc)
    8. With XMLobj
    9. ' Formatierung: 4er-Einzüge verwenden
    10. .Formatting = Xml.Formatting.Indented
    11. .Indentation = 4
    12. ' Dann fangen wir mal an:
    13. .WriteStartDocument()
    14. ' Beginn eines Elements "Personen". Darin werden wir mehrere
    15. ' Elemente "Person" unterbringen.
    16. .WriteStartElement("Material")
    17. ' Hier kommt das erste Element "Material". Eine Person hat
    18. ' in unserem einfachen Beispiel einen Titel, einen Nach-
    19. ' namen und einen Vornamen. Als Demo soll uns das genügen.
    20. .WriteStartElement("Material") ' <Leitfähigkeit und Temperaturkoeffizient
    21. .WriteAttributeString("Bezeichnung", "Silber")
    22. .WriteAttributeString("Leitfähigkeit", "66")
    23. .WriteAttributeString("Temperaturkoeffizient bei 20°C", "0.0041")
    24. .WriteEndElement() ' Leitfähigkeit und Temperaturkoeffizient />
    25. .WriteStartElement("Material") ' <Leitfähigkeit und Temperaturkoeffizient
    26. .WriteAttributeString("Bezeichnung", "Kupfer")
    27. .WriteAttributeString("Leitfähigkeit", "56")
    28. .WriteAttributeString("Temperaturkoeffizient bei 20°C", "0.0039")
    29. .WriteEndElement() ' Leitfähigkeit und Temperaturkoeffizient />
    30. .WriteStartElement("Material") ' <Leitfähigkeit und Temperaturkoeffizient
    31. .WriteAttributeString("Bezeichnung", "Gold")
    32. .WriteAttributeString("Leitfähigkeit", "45.45")
    33. .WriteAttributeString("Temperaturkoeffizient bei 20°C", "0.00398")
    34. .WriteEndElement() ' Leitfähigkeit und Temperaturkoeffizient />
    35. .WriteStartElement("Material") ' <Leitfähigkeit und Temperaturkoeffizient
    36. .WriteAttributeString("Bezeichnung", "Aluminium")
    37. .WriteAttributeString("Leitfähigkeit", "36.00")
    38. .WriteAttributeString("Temperaturkoeffizient bei 20°C", "0.004")
    39. .WriteEndElement() ' Leitfähigkeit und Temperaturkoeffizient />
    40. .WriteStartElement("Material") ' <Leitfähigkeit und Temperaturkoeffizient
    41. .WriteAttributeString("Bezeichnung", "Zink")
    42. .WriteAttributeString("Leitfähigkeit", "16.00")
    43. .WriteAttributeString("Temperaturkoeffizient bei 20°C", "0.0042")
    44. .WriteEndElement() ' Leitfähigkeit und Temperaturkoeffizient />
    45. .WriteStartElement("Material") ' <Leitfähigkeit und Temperaturkoeffizient
    46. .WriteAttributeString("Bezeichnung", "Nickel")
    47. .WriteAttributeString("Leitfähigkeit", "10.50")
    48. .WriteAttributeString("Temperaturkoeffizient bei 20°C", "0.0055")
    49. .WriteEndElement() ' Leitfähigkeit und Temperaturkoeffizient />
    50. .WriteStartElement("Material") ' <Leitfähigkeit und Temperaturkoeffizient
    51. .WriteAttributeString("Bezeichnung", "Platin")
    52. .WriteAttributeString("Leitfähigkeit", "10.20")
    53. .WriteAttributeString("Temperaturkoeffizient bei 20°C", "0.0038")
    54. .WriteEndElement() ' Leitfähigkeit und Temperaturkoeffizient />
    55. .WriteStartElement("Material") ' <Leitfähigkeit und Temperaturkoeffizient
    56. .WriteAttributeString("Bezeichnung", "Zinn")
    57. .WriteAttributeString("Leitfähigkeit", "8.70")
    58. .WriteAttributeString("Temperaturkoeffizient bei 20°C", "0.00463")
    59. .WriteEndElement() ' Leitfähigkeit und Temperaturkoeffizient />
    60. .WriteEndElement() ' </Material>
    61. ' ... und schließen das XML-Dokument (und die Datei)
    62. .Close() ' Document
    63. End With
    64. ' Und so sollte die Ergebnisdatei aussehen:
    65. ' -----------------------------------
    66. '<?xml version="1.0" encoding="utf-16"?>
    67. '<Material>
    68. ' <Bezeichnung="Silber" Leitfähigkeit="66" Temperaturkoeffizient bei 20°C="0.0041" />
    69. '.
    70. '.
    71. '.
    72. '.
    73. '</Material>
    74. '-----------------------------------
    75. End Sub
    76. Private Sub XMLReader()
    77. ' Wir benötigen einen XmlReader für das Auslesen der XML-Datei
    78. Dim XMLReader As Xml.XmlReader _
    79. = New Xml.XmlTextReader("settings.xml")
    80. ' Es folgt das Auslesen der XML-Datei
    81. With XMLReader
    82. Do While .Read ' Es sind noch Daten vorhanden
    83. ' Welche Art von Daten liegt an?
    84. Select Case .NodeType
    85. ' Ein Element
    86. Case Xml.XmlNodeType.Element
    87. Console.WriteLine("Es folgt ein Element vom Typ " & .Name)
    88. ' Alle Attribute (Name-Wert-Paare) abarbeiten
    89. If .AttributeCount > 0 Then
    90. ' Es sind noch weitere Attribute vorhanden
    91. While .MoveToNextAttribute ' nächstes
    92. Console.WriteLine("Feldname: " & .Name & " -> " & "Feldwert: " & .Value)
    93. End While
    94. End If
    95. ' Ein Text
    96. Case Xml.XmlNodeType.Text
    97. Console.WriteLine("Es folgt ein Text: " & .Value)
    98. ' Ein Kommentar
    99. Case Xml.XmlNodeType.Comment
    100. Console.WriteLine("Es folgt ein Kommentar: " & .Value)
    101. End Select
    102. Loop ' Weiter nach Daten schauen
    103. .Close() ' XMLTextReader schließen
    104. End With
    105. ' Und so sieht das Ergebnis der Ausgabe aus:
    106. ' ------------------------------------------
    107. 'Es folgt ein Element vom Typ Personen
    108. 'Es folgt ein Element vom Typ Person
    109. 'Feldname: Titel -> Feldwert: Dr.
    110. 'Feldname: Name -> Feldwert: Meyer
    111. 'Feldname: Vorname -> Feldwert: Hans
    112. 'Es folgt ein Element vom Typ Person
    113. 'Feldname: Titel -> Feldwert:
    114. 'Feldname: Name -> Feldwert: Schmidt
    115. 'Feldname: Vorname -> Feldwert: Carlos
    116. End Sub


    Was habe ich vor?! kurz beschrieben:
    ich möchte Variablen einer Form in einer externen Datei speichern und diese beim neustart laden lassen.

    in der Form gibt es ComboBoxen dessen Inhalt ich mit werten aus der externen (.xml, .ini) Datei füllen möchte.

    mit der VisualStudio eigenen mySettings Möglichkeit hab ich's hinbekommen, jedoch ist dies nicht so wie ich's benötige (keine externe Datei).

    wäre euch dankbar, wenn mir wer eine Quelle aufzeigen könnte oder gar ein Beispiel postet.


    Gruß Frosch
    Plus an Masse, dass knallt klasse!
    Hi

    Schau dir das mal an.
    Damit kannst du Klassen serialisieren.

    Quellcode

    1. Imports System.Runtime.Serialization
    2. Public Shared Sub SaveXml(Of T)(ByVal obj As T, ByVal file As String)
    3. Dim f As New System.IO.FileInfo(file)
    4. If Not f.Directory.Exists Then
    5. f.Directory.Create()
    6. End If
    7. If f.Exists Then
    8. f.Delete()
    9. End If
    10. Using fs As New System.IO.FileStream(f.FullName, System.IO.FileMode.OpenOrCreate)
    11. Dim txtW As System.IO.TextWriter = New System.IO.StreamWriter(fs)
    12. Dim xmlSer As New Xml.Serialization.XmlSerializer(obj.GetType())
    13. xmlSer.Serialize(txtW, obj)
    14. fs.Flush()
    15. End Using
    16. End Sub
    17. Public Shared Function LoadXml(Of T)(ByRef obj As T, ByVal file As String) As T
    18. Dim f As New System.IO.FileInfo(file)
    19. If Not f.Directory.Exists Then
    20. f.Directory.Create()
    21. End If
    22. If Not f.Exists Then
    23. Throw New Exception("File not exits: " & file)
    24. End If
    25. Using fs As New System.IO.FileStream(file, System.IO.FileMode.OpenOrCreate)
    26. Dim xmlSer As New Xml.Serialization.XmlSerializer(GetType(T))
    27. obj = DirectCast(xmlSer.Deserialize(fs), T)
    28. End Using
    29. Return obj
    30. End Function
    @Naifu Jou.
    @Frosch Maxch Dir eine Klasse, in die Du alle Deine Settings als Properties reinpackst.
    Die Instanz dieser Klasse lädtst und speicherst Du mit dem Code von Naifu.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke @Naifu,

    könntest Du ggf. noch etwas zum Code sagen?!

    also mit dem Code, wird eine .xml Datei erstellt, aber ehrlich gesagt blick ich überhaupt nicht, was der Code macht:

    VB.NET-Quellcode

    1. Public Shared Sub SaveXml(Of T)(ByVal obj As T, ByVal file As String)
    2. Dim f As New System.IO.FileInfo(file)
    3. If Not f.Directory.Exists Then
    4. f.Directory.Create()
    5. End If
    6. If f.Exists Then
    7. f.Delete()
    8. End If
    9. Using fs As New System.IO.FileStream(f.FullName, System.IO.FileMode.OpenOrCreate)
    10. Dim txtW As System.IO.TextWriter = New System.IO.StreamWriter(fs)
    11. Dim xmlSer As New Xml.Serialization.XmlSerializer(obj.GetType())
    12. xmlSer.Serialize(txtW, obj)
    13. fs.Flush()
    14. End Using
    15. End Sub
    • Zeile 3 schreibe das Dateiverzeichnis in die Variable "f"
    • Zeile 4 Wenn Verzeichnis nicht existiert, dann erstell ein Verzeichnis (ist diese Bedingung nicht völlig überflüssig, es wird immer ein Verzeichnis geben, da das Programm ja letztlich i.wo liegen muss (.exe)!?)
    • Zeile 6 Wenn (Datei!?) existiert, dann lösche diese Datei oder lösche den Inhalt der Variabel "f"?!
    und dann verließen sie mich auch schon wieder...
    • Zeile 9 Benutze "fS" als neue System Ein-/Ausgabe in dem Verzeichnis "f" öffne, wenn vorhanden oder erstell eine neue Datei???!!!
    • Zeile 10 Schreibe in der Datei mit/im xml Syntax???!!!
    @RodFromGermany
    Maxch Dir eine Klasse, in die Du alle Deine Settings als Properties reinpackst.Die Instanz dieser Klasse lädtst und speicherst Du mit dem Code von Naifu.Feddich.

    könntest Du mir diesbezüglich vielleicht ein Beispiel machen/zeigen?

    Ich bin zwar kein vollkommener Anfänger bzgl. dem programmieren, zumal ich beruflich unter anderem Microcontroller programmiere und brenne, aber mit Windows-Anwendungen hab ich bisher keine allzu großen Erfahrungen gemacht;-)

    PS: ich bin eig. niemand, der alles mundgerecht serviert bekommen möchte, doch um ehrlich zu sein hängt mein Programm schon seit ca. 2 Wochen an dieser Stelle, ich würd gern weiter kommen ;)


    Gruß Frosch
    Plus an Masse, dass knallt klasse!

    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „Frosch“ ()

    Check it out, und studiere mal die FileInfo Klasse. ;o)

    VB.NET-Quellcode

    1. ​Imports System.Runtime.Serialization
    2. Public Class Form4
    3. Public Class TestPerson
    4. Property Name As String
    5. Property Vorname As String
    6. End Class
    7. Public Class TestPersonen
    8. Property Personen As New List(Of TestPerson)
    9. End Class
    10. Private TargetFile As String = "C:\Test\Personen.xml"
    11. Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. Dim pp As New TestPersonen
    13. pp.Personen.Add(New TestPerson With {.Name = "Wirsch", .Vorname = "Kalle"})
    14. XMLIO.SaveXml(Of TestPersonen)(pp, TargetFile)
    15. pp.Personen.Clear()
    16. Stop
    17. pp = XMLIO.LoadXml(Of TestPersonen)(pp, TargetFile)
    18. Stop
    19. End Sub
    20. End Class
    21. Public Class XMLIO
    22. Public Shared Sub SaveXml(Of T)(ByVal obj As T, ByVal file As String)
    23. Dim f As New System.IO.FileInfo(file)
    24. If Not f.Directory.Exists Then
    25. f.Directory.Create()
    26. End If
    27. If f.Exists Then
    28. f.Delete()
    29. End If
    30. Using fs As New System.IO.FileStream(f.FullName, System.IO.FileMode.OpenOrCreate)
    31. Dim txtW As System.IO.TextWriter = New System.IO.StreamWriter(fs)
    32. Dim xmlSer As New Xml.Serialization.XmlSerializer(obj.GetType())
    33. xmlSer.Serialize(txtW, obj)
    34. fs.Flush()
    35. End Using
    36. End Sub
    37. Public Shared Function LoadXml(Of T)(ByRef obj As T, ByVal file As String) As T
    38. Dim f As New System.IO.FileInfo(file)
    39. If Not f.Directory.Exists Then
    40. f.Directory.Create()
    41. End If
    42. If Not f.Exists Then
    43. Throw New Exception("File not exits: " & file)
    44. End If
    45. Using fs As New System.IO.FileStream(file, System.IO.FileMode.OpenOrCreate)
    46. Dim xmlSer As New Xml.Serialization.XmlSerializer(GetType(T))
    47. obj = DirectCast(xmlSer.Deserialize(fs), T)
    48. End Using
    49. Return obj
    50. End Function
    51. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Frosch schrieb:

    Sry aber ohne Kommentare oder Erklärungen kann ich nicht wirklich viel mit dem Code anfangen
    Das Einzige was du mit dem Code anfangen sollst ist, laufen lassen und schauen was passiert.
    Das ist jetzt schon gut vor gekaut und im Grune genommen Gebrauchs fertig.

    So viel zu:

    Frosch schrieb:

    PS: ich bin eig. niemand, der alles mundgerecht serviert bekommen möchte, doch um ehrlich zu sein hängt mein Programm schon seit ca. 2 Wochen an dieser Stelle, ich würd gern weiter kommen

    Du hast alles was du brauchst um weiter zu kommen, mach was draus.