XML: Problem bei der Eintragung der Daten in XML

  • VB.NET
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    XML: Problem bei der Eintragung der Daten in XML

    Hiho,

    ein weiteres Problem ergab sich, wo ich nach ewiger Suche kein Problem finde was mein Problem auslösen könnte und finde auch keine Lösung zu dem mir nicht bekannten Problem. Anstatt mit einer Datenbank möchte ich mit XML in meinem Programm arbeiten. Deswegen habe ich auf den Button der auch den Vertragdruck ausführt, ein Bereich reingearbeitet wo eine XML Datei mit allen Daten angelegt und gespeichert werden. Dieses sieht wie folgt aus:

    VB.NET-Quellcode

    1. Public Sub BTNAufBes_Click(sender As Object, e As EventArgs) Handles BTNAufBes.Click
    2. RegVorname = NAVorname.Text
    3. RegNachname = NANachname.Text
    4. RegAusweiss = NAAusweissnummer.Text
    5. RegWohnhaft = NAWohnort.Text
    6. RegGeraet = NAGeraet.Text
    7. RegIMEI = NaIMEI.Text
    8. RegModel = NAModel.Text
    9. RegSchaden = NASchaden.Text
    10. RegPreis = NAPreis.Text
    11. RegTermin = NATermin.Text
    12. RegTel = NATelefon.Text
    13. 'XML Section'
    14. Dim XmlDoc As New XmlDocument
    15. 'XML Declaration
    16. Dim XmlDeclaration As XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
    17. 'RootElement Section
    18. Dim RootNode As XmlElement = XmlDoc.CreateElement("RootNode")
    19. XmlDoc.InsertBefore(XmlDeclaration, XmlDoc.DocumentElement)
    20. XmlDoc.AppendChild(RootNode)
    21. 'New <Category> element add to the root node
    22. Dim ParentNode As XmlElement = XmlDoc.CreateElement("Kunde")
    23. 'Set attribute name and value!
    24. ParentNode.SetAttribute("Datensatz", RegAusweiss)
    25. XmlDoc.DocumentElement.PrependChild(ParentNode)
    26. (Elements)
    27. Dim AusweissID As XmlElement = XmlDoc.CreateElement("AusweissID")
    28. Dim Vorname As XmlElement = XmlDoc.CreateElement("Vorname")
    29. Dim Nachname As XmlElement = XmlDoc.CreateElement("Nachname")
    30. Dim Wohnort As XmlElement = XmlDoc.CreateElement("Wohnort")
    31. Dim Telefon As XmlElement = XmlDoc.CreateElement("Telefon")
    32. (Text Elements)
    33. Dim AusweissIDFeld As XmlText = XmlDoc.CreateTextNode(RegAusweiss)
    34. Dim VornameFeld As XmlText = XmlDoc.CreateTextNode(RegVorname)
    35. Dim NachnameFeld As XmlText = XmlDoc.CreateTextNode(RegNachname)
    36. Dim WohnhaftFeld As XmlText = XmlDoc.CreateTextNode(RegWohnhaft)
    37. Dim TelefonFeld As XmlText = XmlDoc.CreateTextNode(RegTel)
    38. ParentNode.AppendChild(AusweissIDFeld)
    39. ParentNode.AppendChild(VornameFeld)
    40. ParentNode.AppendChild(NachnameFeld)
    41. ParentNode.AppendChild(WohnhaftFeld)
    42. ParentNode.AppendChild(TelefonFeld)
    43. 'save the value of the fields into the nodes
    44. AusweissID.AppendChild(AusweissIDFeld)
    45. Vorname.AppendChild(VornameFeld)
    46. Nachname.AppendChild(NachnameFeld)
    47. Wohnort.AppendChild(WohnhaftFeld)
    48. Telefon.AppendChild(TelefonFeld)
    49. 'Save to the XML file
    50. XmlDoc.Save(RegAusweiss + "-kunde-" + RegNachname + ".xml")
    51. 'XML SEKTION ENDE'
    52. Using dlg As New PrintPreviewDialog
    53. Me.PrintDocument1.DocumentName = "Test" ' Arbeitstitel
    54. dlg.Document = Me.PrintDocument1
    55. dlg.ShowDialog()
    56. End Using
    57. End Sub


    Das scheint auch Grundlegend zu klappen. Er speichert die Datei ab in diesem Beispiel dann unter "J2KL87U2-kunde-Buchmann" also wie ich es auch möchte "Kundenummer-Kunde-Nachname ! Öffne ich nun die Datei scheinen auch die ersten Schritte ohne Problem zu funktionieren, daher in der Datei:

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <RootNode>
    3. <Kunde Datensatz="J2KL87U2">
    4. </Kunde>
    5. </RootNode>

    aufzufinden ist. Also scheint er ja auf jedenfall ohne Probleme den Bereich

    VB.NET-Quellcode

    1. 'XML Section'
    2. Dim XmlDoc As New XmlDocument
    3. 'XML Declaration
    4. Dim XmlDeclaration As XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
    5. 'RootElement Section
    6. Dim RootNode As XmlElement = XmlDoc.CreateElement("RootNode")
    7. XmlDoc.InsertBefore(XmlDeclaration, XmlDoc.DocumentElement)
    8. XmlDoc.AppendChild(RootNode)
    9. 'New <Category> element add to the root node
    10. Dim ParentNode As XmlElement = XmlDoc.CreateElement("Kunde")
    11. 'Set attribute name and value!
    12. ParentNode.SetAttribute("Datensatz", RegAusweiss)
    13. XmlDoc.DocumentElement.PrependChild(ParentNode)

    alles danach scheint er nicht anzulegen, ich bekomme aber auch keinerlei Fehlermeldung. Die Druckvorschau die sich nach der Speicherung öffnet übernimmt die Variablen aber perfekt an den Stellen wo die Daten rein gehören, womit sich ausschließt das die Variablen nicht arbeiten. Hat jemand eine Idee oder Lösung ?

    Liebe Grüße <3
    Dateien
    @DerWaldFried Pack die Daten und die Serialisierung selbst in eine Datenklasse und greif dann vom Programm aus auf die Daten zu:
    Daten

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Imports System.Xml.Serialization
    4. ''' <summary>
    5. ''' Datenklasse
    6. ''' </summary>
    7. ''' <remarks>mit XML-Serialisierung</remarks>
    8. Public Class MyData
    9. ' alle vorkommenden Daten
    10. Public Property name() As String
    11. Public Property address() As String
    12. Public Property type() As Integer
    13. Public Property timestamp() As DateTime
    14. Public Property flags() As Integer
    15. Public Property user() As String
    16. Public Property SingleValues() As List(Of Integer)
    17. Public Sub New()
    18. ' Hier die Daten mit Defaultwerten befüllen oder nicht
    19. Me.name = "Hase"
    20. Me.SingleValues = New List(Of Integer)
    21. End Sub
    22. ''' <summary>
    23. ''' Daten aus einer Datei lesen
    24. ''' </summary>
    25. ''' <param name="file">Dateiname</param>
    26. ''' <returns>die geladene Instanz</returns>
    27. Public Shared Function LoadData(file As String) As MyData
    28. Dim data As New MyData()
    29. Try
    30. ' Deserialize XML file to a new object.
    31. Using sr As New StreamReader(file, Encoding.Default)
    32. Dim x As New XmlSerializer(data.GetType())
    33. data = DirectCast(x.Deserialize(sr), MyData)
    34. End Using
    35. Return data
    36. Catch
    37. ' nix tun, die Daten-Instanz ist nicht valid,
    38. ' es wird die Instanz übergeben, die bei New() erzeugt wird
    39. End Try
    40. Return data
    41. End Function
    42. ''' <summary>
    43. ''' Daten in eine Datei schreiben
    44. ''' </summary>
    45. ''' <param name="file">Dateiname</param>
    46. Public Sub WriteData(file As String)
    47. ' Serialize object to a XML file.
    48. Using sw As New StreamWriter(file, False, Encoding.Default)
    49. Dim x As New XmlSerializer(Me.GetType())
    50. x.Serialize(sw, Me)
    51. End Using
    52. End Sub
    53. End Class
    Test-GUI

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private XmlFile As String = "c:\temp\data.xml" ' Pfad zum Speichern / Lesen
    3. Private Data As MyData
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. '' Daten-Instanz erstellen und befüllen
    6. 'Me.Data = New MyData()
    7. 'Me.Data.name = "Test Status"
    8. 'Me.Data.address = "0000"
    9. 'Me.Data.type = 9999
    10. 'Me.Data.timestamp = DateTime.Now
    11. 'Me.Data.flags = 0
    12. 'Me.Data.user = "Tester"
    13. 'Me.Data.SingleValues = New List(Of Integer) From {1, 2, 3, 4, 5}
    14. End Sub
    15. ''' <summary>
    16. ''' Daten auf Festplatte schreiben
    17. ''' </summary>
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. Me.Data.WriteData(Me.XmlFile)
    20. End Sub
    21. ''' <summary>
    22. ''' Daten von Festplatte laden
    23. ''' </summary>
    24. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    25. Me.Data = MyData.LoadData(Me.XmlFile)
    26. End Sub
    27. ''' <summary>
    28. ''' aktuelle Daten darstellen
    29. ''' </summary>
    30. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    31. Me.ListBox1.Items.Clear()
    32. ' hier: nur das Integer-Array
    33. For Each value In Me.Data.SingleValues
    34. Me.ListBox1.Items.Add(value)
    35. Next
    36. End Sub
    37. 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!
    Okay ich habe nun tagelang gefummelt aber klappen will es nicht. Ich habe aber mal eine Frage. Ich lese ja in

    VB.NET-Quellcode

    1. ParentNode.SetAttribute("Datensatz", RegAusweiss)

    die Variable RegAusweiss aus und diese wird dann auch ohne Probleme in den Parent "Kunde" eingetragen. Danach der ganzen Bereich:

    VB.NET-Quellcode

    1. 'Create the required nodes (Elements)
    2. Dim AusweissID As XmlElement = XmlDoc.CreateElement("AusweissID")
    3. Dim Vorname As XmlElement = XmlDoc.CreateElement("Vorname")
    4. Dim Nachname As XmlElement = XmlDoc.CreateElement("Nachname")
    5. Dim Wohnort As XmlElement = XmlDoc.CreateElement("Wohnort")
    6. Dim Telefon As XmlElement = XmlDoc.CreateElement("Telefon")
    7. 'retrieve the text (Text Elements)
    8. Dim AusweissIDFeld As XmlText = XmlDoc.CreateTextNode(RegAusweiss)
    9. Dim VornameFeld As XmlText = XmlDoc.CreateTextNode(RegVorname)
    10. Dim NachnameFeld As XmlText = XmlDoc.CreateTextNode(RegNachname)
    11. Dim WohnhaftFeld As XmlText = XmlDoc.CreateTextNode(RegWohnhaft)
    12. Dim TelefonFeld As XmlText = XmlDoc.CreateTextNode(RegTel)
    13. 'append the nodes to the parentNode without the value
    14. ParentNode.AppendChild(AusweissIDFeld)
    15. ParentNode.AppendChild(VornameFeld)
    16. ParentNode.AppendChild(NachnameFeld)
    17. ParentNode.AppendChild(WohnhaftFeld)
    18. ParentNode.AppendChild(TelefonFeld)
    19. 'save the value of the fields into the nodes
    20. AusweissID.AppendChild(AusweissIDFeld)
    21. Vorname.AppendChild(VornameFeld)
    22. Nachname.AppendChild(NachnameFeld)
    23. Wohnort.AppendChild(WohnhaftFeld)
    24. Telefon.AppendChild(TelefonFeld)


    Hier falls wichtig mal meine ganze Datei:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub BTNClose_Click(sender As Object, e As EventArgs) Handles BTNClose.Click
    3. Application.Exit()
    4. End Sub
    5. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    6. NAPanel.Enabled = True
    7. NAPanel.Visible = True
    8. End Sub
    9. Public Property RegVorname As String
    10. Public Property RegNachname As String
    11. Public Property RegAusweiss As String
    12. Public Property RegWohnhaft As String
    13. Public Property RegGeraet As String
    14. Public Property RegIMEI As String
    15. Public Property RegModel As String
    16. Public Property RegSchaden As String
    17. Public Property RegPreis As String
    18. Public Property RegTermin As String
    19. Public Property RegTel As String
    20. Public Sub BTNAufBes_Click(sender As Object, e As EventArgs) Handles BTNAufBes.Click
    21. RegVorname = NAVorname.Text
    22. RegNachname = NANachname.Text
    23. RegAusweiss = NAAusweissnummer.Text
    24. RegWohnhaft = NAWohnort.Text
    25. RegGeraet = NAGeraet.Text
    26. RegIMEI = NaIMEI.Text
    27. RegModel = NAModel.Text
    28. RegSchaden = NASchaden.Text
    29. RegPreis = NAPreis.Text
    30. RegTermin = NATermin.Text
    31. RegTel = NATelefon.Text
    32. 'XML Section'
    33. Dim XmlDoc As New XmlDocument
    34. 'XML Declaration
    35. Dim XmlDeclaration As XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
    36. 'RootElement Section
    37. Dim RootNode As XmlElement = XmlDoc.CreateElement("RootNode")
    38. XmlDoc.InsertBefore(XmlDeclaration, XmlDoc.DocumentElement)
    39. XmlDoc.AppendChild(RootNode)
    40. 'New <Category> element add to the root node
    41. Dim ParentNode As XmlElement = XmlDoc.CreateElement("Kunde")
    42. 'Set attribute name and value!
    43. ParentNode.SetAttribute("Datensatz", RegAusweiss)
    44. XmlDoc.DocumentElement.PrependChild(ParentNode)
    45. 'Create the required nodes (Elements)
    46. Dim AusweissID As XmlElement = XmlDoc.CreateElement("AusweissID")
    47. Dim Vorname As XmlElement = XmlDoc.CreateElement("Vorname")
    48. Dim Nachname As XmlElement = XmlDoc.CreateElement("Nachname")
    49. Dim Wohnort As XmlElement = XmlDoc.CreateElement("Wohnort")
    50. Dim Telefon As XmlElement = XmlDoc.CreateElement("Telefon")
    51. 'retrieve the text (Text Elements)
    52. Dim AusweissIDFeld As XmlText = XmlDoc.CreateTextNode(RegAusweiss)
    53. Dim VornameFeld As XmlText = XmlDoc.CreateTextNode(RegVorname)
    54. Dim NachnameFeld As XmlText = XmlDoc.CreateTextNode(RegNachname)
    55. Dim WohnhaftFeld As XmlText = XmlDoc.CreateTextNode(RegWohnhaft)
    56. Dim TelefonFeld As XmlText = XmlDoc.CreateTextNode(RegTel)
    57. 'append the nodes to the parentNode without the value
    58. ParentNode.AppendChild(AusweissIDFeld)
    59. ParentNode.AppendChild(VornameFeld)
    60. ParentNode.AppendChild(NachnameFeld)
    61. ParentNode.AppendChild(WohnhaftFeld)
    62. ParentNode.AppendChild(TelefonFeld)
    63. 'save the value of the fields into the nodes
    64. AusweissID.AppendChild(AusweissIDFeld)
    65. Vorname.AppendChild(VornameFeld)
    66. Nachname.AppendChild(NachnameFeld)
    67. Wohnort.AppendChild(WohnhaftFeld)
    68. Telefon.AppendChild(TelefonFeld)
    69. 'Save to the XML file
    70. XmlDoc.Save(RegAusweiss + "-kunde-" + RegNachname + ".xml")
    71. 'XML SEKTION ENDE'
    72. Using dlg As New PrintPreviewDialog
    73. Me.PrintDocument1.DocumentName = "Test" ' Arbeitstitel
    74. dlg.Document = Me.PrintDocument1
    75. dlg.ShowDialog()
    76. End Using
    77. End Sub
    78. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    79. e.Graphics.DrawString("Reperaturvetrag", New Font("arial", 30), Brushes.Black, New Point(30, 30))
    80. e.Graphics.DrawString("Hiermit bestätigt der Kunde", New Font("arial", 16), Brushes.Black, New Point(30, 100))
    81. e.Graphics.DrawString(RegNachname + " das sein " + RegGeraet, New Font("arial", 16), Brushes.Black, New Point(310, 100))
    82. e.Graphics.DrawString("mit dem Model " + RegModel + " und dem Schaden " + RegSchaden, New Font("arial", 16), Brushes.Black, New Point(30, 125))
    83. e.Graphics.DrawString("für den Preis von " + RegPreis + "€ repariert werden soll. Mit dem Kunden ist der ", New Font("arial", 16), Brushes.Black, New Point(30, 145))
    84. e.Graphics.DrawString(RegTermin + " abgemacht worden um das Gerät abzuholen. Sollte es kein", New Font("arial", 16), Brushes.Black, New Point(30, 165))
    85. e.Graphics.DrawString("Aufschubvertrag geben, so wird das abholen maximal 15 Tage danach nötig,", New Font("arial", 16), Brushes.Black, New Point(30, 185))
    86. e.Graphics.DrawString("daher das Gerät sonst in unseren Besitz übergeht und verkauft wird!", New Font("arial", 16), Brushes.Black, New Point(30, 205))
    87. e.Graphics.DrawString("sollte das Gerät vorher repariert sein oder ein Problem auftauchen,", New Font("arial", 16), Brushes.Black, New Point(30, 225))
    88. e.Graphics.DrawString("rufen wir den Kunden auf die Nummer " + RegTel + " an um das Problem", New Font("arial", 16), Brushes.Black, New Point(30, 245))
    89. e.Graphics.DrawString("mit dem Kunden mündlich zu klären. Mit der Unterschrift bestätigt der", New Font("arial", 16), Brushes.Black, New Point(30, 265))
    90. e.Graphics.DrawString("Kunde seine Zahlungsfähigkeit und den Vertrag verstanden zu haben.", New Font("arial", 16), Brushes.Black, New Point(30, 285))
    91. e.Graphics.DrawString("_____________________________", New Font("arial", 16), Brushes.Black, New Point(30, 365))
    92. e.Graphics.DrawString("_____________________________", New Font("arial", 16), Brushes.Black, New Point(420, 365))
    93. e.Graphics.DrawString("Unterschrift, Datum und Ort Kunde", New Font("arial", 15), Brushes.Black, New Point(30, 390))
    94. e.Graphics.DrawString("Unterschrift, Datum und Ort Mitarbeiter", New Font("arial", 15), Brushes.Black, New Point(420, 390))
    95. e.Graphics.DrawString("Wichtige Informationen", New Font("arial", 15), Brushes.Black, New Point(30, 460))
    96. End Sub
    97. End Class


    scheint ja dann nicht mehr zu funktionieren. Ist da vielleicht irgendein Vorgang von mir falsch das deine Lösung nicht klappen will ? Liebe Grüße
    @DerWaldFried Du hast jetzt zwei disjunkte Ansätze vermischt.
    Du behandelst eine spezielle XML-Klasse mit der von Dir gewünschten Struktur. Du musst zum Lesen und Schreiben der Elemente XML-Prozeduren verwenden.
    Ich behandle eine allgemeine Datenklasse, die an sich nichts von XML weiß, die lediglich XML-serialisiert wird.
    Beide Varianten können zum Ziel führen, aber sie dürfen nicht vermischt werden :!:
    Befasse Dich in je einem kleinen Testprojekt mit beiden Methoden und dann überlege und entscheide, welche Methode für Dich die zielführende ist.
    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!