Daten in xml-Datei schreiben und wieder abrufen?

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.

    Daten in xml-Datei schreiben und wieder abrufen?

    Ich möchte gerne einzelne My.Settings-Einträge in eine Textdatei schreiben, und nach einem Update des Programms wieder auslesen können.
    Kann mir jemand sagen, wie ich das so hinbekommen würde:

    Im Programm:
    My.Settings.wert1 = 10
    My.Settings.wert2 = 30
    My.Settings.wert3 = 60

    Später in der Textdatei:
    wert1=10
    wert2=30
    wert3=60

    Wie schreibe ich das so (mit Zeilen) in eine Textdatei?

    Und wenn ich später die neue, "frische" Version des Programms ausführe, soll es die Daten aus der settings.txt lesen und in My.Settings übernehmen.
    (Die My.Settings-Einträge sind schon vorhanden, d.h. ich muss dem Programm nicht sagen, dass die My.Settings-Einträge so heißen sollen wie in der Textdatei)
    Dein Tutorial beschreibt mir ja, wie ich eine XML-Datei erstelle, die folgendes Layout hat:

    <Erstes Tag>
    <Zweites Tag>
    <Drittes Tag>Wert</Drittes Tag>
    etc.

    Ich bräuchte direkt eine XML-Datei, die folgendes Layout hat:

    <Einstellungen>
    <autostart>true</Autostart>
    <minime>true</minime>
    <percent>20</percent>
    <sound>true</sound>
    </Einstellungen>

    Aber ich finde im Tutorial nichts, das mir beschreibt, wie ich direkt mehrere dieser Unterpunkte untereinander machen kann, ohne bereits eine XML-Datei zu haben.
    Wie würde ich das jetzt hinkriegen?
    Also... Beim Testen der Sicherungsfunktion kommt folgende Meldung:

    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in BattCheck.exe aufgetreten.
    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    VB.NET-Quellcode

    1. XmlWriter.Formatting = Formatting.Indented
    2. XmlWriter.Indentation = 4
    3. XmlWriter.WriteStartElement("Settings")
    4. XmlWriter.Close()
    5. prozent = XmlDoc.CreateElement("prozent")
    6. autostart = XmlDoc.CreateElement("autostart")
    7. minimized = XmlDoc.CreateElement("minimized")
    8. playsound = XmlDoc.CreateElement("playsound")
    9. prozent.AppendChild(XmlDoc.CreateTextNode(My.Settings.prozent))
    10. autostart.AppendChild(XmlDoc.CreateTextNode(My.Settings.autostart))
    11. minimized.AppendChild(XmlDoc.CreateTextNode(My.Settings.minimized))
    12. playsound.AppendChild(XmlDoc.CreateTextNode(My.Settings.playsound))
    13. NewNode.AppendChild(prozent)
    14. NewNode.AppendChild(autostart)
    15. NewNode.AppendChild(minimized)
    16. NewNode.AppendChild(playsound)
    17. XmlDoc.ChildNodes(0).AppendChild(NewNode)
    18. XmlDoc.Save("settings.xml")


    Das ist mein verwendeter Code.
    VB08 hat mir diese Zeile gelb hinterlegt: NewNode.AppendChild(prozent)
    Was will mir das Programm sagen? :S
    Ich habe den Code in der Zwischenzeit ein wenig angepasst:

    Ganz oben steht:

    VB.NET-Quellcode

    1. Dim XmlWriter As New XmlTextWriter("settings.xml", New System.Text.UnicodeEncoding)
    2. Dim XmlDoc As New XmlDocument
    3. Dim NewNode As XmlNode
    4. Dim prozent, autostart, minimized, playsound As XmlNode


    und im Button3_Click-Zeug steht:

    VB.NET-Quellcode

    1. XmlWriter.Formatting = Formatting.Indented
    2. XmlWriter.Indentation = 4
    3. XmlWriter.WriteStartElement("Settings")
    4. XmlWriter.WriteEndElement()
    5. XmlWriter.Close()
    6. NewNode = XmlDoc.CreateElement("BattCheck")
    7. prozent = XmlDoc.CreateElement("prozent")
    8. autostart = XmlDoc.CreateElement("autostart")
    9. minimized = XmlDoc.CreateElement("minimized")
    10. playsound = XmlDoc.CreateElement("playsound")
    11. prozent.AppendChild(XmlDoc.CreateTextNode(My.Settings.prozent))
    12. autostart.AppendChild(XmlDoc.CreateTextNode(My.Settings.autostart))
    13. minimized.AppendChild(XmlDoc.CreateTextNode(My.Settings.minimized))
    14. playsound.AppendChild(XmlDoc.CreateTextNode(My.Settings.playsound))
    15. NewNode.AppendChild(prozent)
    16. NewNode.AppendChild(autostart)
    17. NewNode.AppendChild(minimized)
    18. NewNode.AppendChild(playsound)
    19. XmlDoc.Save("settings.xml")


    Jetzt ist die Fehlermeldung wie folgt:


    Edit: Allersings ist mir nicht ganz klar, warum das Bild nicht angezeigt wird, im Bearbeitungsmodus sehe ich es, in der normalen Threadansicht nicht :P
    Jetzt kommt bitte nicht und sagt ich poste Copy&Paste Code. Mit diesem Beispiel arbeite ich momentan selber und das habe auch aus dem CodeBook 2008.

    VB.NET-Quellcode

    1. Dim locXmlDocument As New Xml.XmlDocument()
    2. Dim locXmlElement As Xml.XmlElement = Nothing
    3. Dim XmlDeclaration As Xml.XmlDeclaration = locXmlDocument.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
    4. Dim RootNode As Xml.XmlElement = locXmlDocument.CreateElement("RootNode")
    5. locXmlDocument.InsertBefore(XmlDeclaration, locXmlDocument.DocumentElement)
    6. locXmlDocument.AppendChild(RootNode)
    7. 'Create a new <Category> element and add it to the root node
    8. Dim ParentNode As Xml.XmlElement = locXmlDocument.CreateElement("Parent")
    9. 'Set attribute name and value!
    10. ParentNode.SetAttribute("AttributName", "AttributWert")
    11. locXmlDocument.DocumentElement.PrependChild(ParentNode)
    12. 'Create the required nodes
    13. Dim FirstElement As Xml.XmlElement = locXmlDocument.CreateElement("FirstElement")
    14. Dim SecondElement As Xml.XmlElement = locXmlDocument.CreateElement("SecondElement")
    15. Dim ThirdElement As Xml.XmlElement = locXmlDocument.CreateElement("ThirdElement")
    16. 'retrieve the text
    17. Dim FirstTextElement As Xml.XmlText = locXmlDocument.CreateTextNode("This is the text from the first element")
    18. Dim SecondTextElement As Xml.XmlText = locXmlDocument.CreateTextNode("This is the text from the second element")
    19. Dim ThirdTextElement As Xml.XmlText = locXmlDocument.CreateTextNode("This is the text from the third element")
    20. 'append the nodes to the parentNode without the value
    21. ParentNode.AppendChild(FirstElement)
    22. ParentNode.AppendChild(SecondElement)
    23. ParentNode.AppendChild(ThirdElement)
    24. 'save the value of the fields into the nodes
    25. FirstElement.AppendChild(FirstTextElement)
    26. SecondElement.AppendChild(SecondTextElement)
    27. ThirdElement.AppendChild(ThirdTextElement)
    28. locXmlDocument.Save("D:\test.xml")
    Vielen Dank! :)
    Mit ein paar Anpassungen funktioniert dieser Code einwandfrei! :)
    Kostet dieses CodeBook was oder ist das ein OpenBook?

    Edit: Noch eine Frage:
    Wie kann ich jetzt genau die vier Tags auslesen, die ich eben erstellt habe?
    (prozent, autostart, minimized, playsound)
    Ich finde das alles etwas kompliziert :huh:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Samus Aran“ ()

    Das müsste ich mir jetzt kaufen, was wieder mind. ne Woche dauern würde :/
    Hast du den Code zum Lesen von XML-Dateien nicht gerade zur Hand?

    Edit: Ist egal, ich hab mich jetzt mal ne Stunde hingesetzt, und folgendes rausbekommen:

    VB.NET-Quellcode

    1. If File.Exists("settings.xml") Then
    2. Dim m_xmlr As XmlTextReader
    3. m_xmlr = New XmlTextReader("settings.xml")
    4. m_xmlr.WhitespaceHandling = WhitespaceHandling.None
    5. m_xmlr.Read()
    6. m_xmlr.Read()
    7. While Not m_xmlr.EOF
    8. m_xmlr.Read()
    9. If Not m_xmlr.IsStartElement() Then
    10. Exit While
    11. End If
    12. m_xmlr.Read()
    13. Label2.Text = "Warnschwelle: " & m_xmlr.ReadElementString("prozent") & "%"
    14. Label3.Text = "Autostart: " & m_xmlr.ReadElementString("autostart")
    15. Label4.Text = "Minimiert starten: " & m_xmlr.ReadElementString("minimized")
    16. Label5.Text = "Sound abspielen: " & m_xmlr.ReadElementString("playsound")
    17. End While
    18. m_xmlr.Close()
    19. End If


    Und das beste: Es funktioniert :D
    Vielen Dank an alle, die mir geholfen haben! :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Samus Aran“ ()

    Samus Aran schrieb:

    Das müsste ich mir jetzt kaufen, was wieder mind. ne Woche dauern würde :/

    Such mal mit Google nach dem Codebook dann findest du es auch bei Google Books.

    Samus Aran schrieb:

    Hast du den Code zum Lesen von XML-Dateien nicht gerade zur Hand?

    Hier mal ein Beispiel.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim XmlDocument As New Xml.XmlDocument()
    4. Dim XmlNode As Xml.XmlNode = Nothing
    5. XmlDocument.Load("D:\settings.xml")
    6. XmlNode = XmlDocument.SelectSingleNode("Einstellungen/autostart")
    7. MessageBox.Show(XmlNode.InnerText)
    8. End Sub
    9. End Class