Mehrere Einträge einer XML in eine List Importieren

  • VB.NET
  • .NET 5–6

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Silvergreen.

    Mehrere Einträge einer XML in eine List Importieren

    Moin Moin

    Was habe ich vor?

    In meinem Programm kann man Komponenten erstellen, welche 7 Werte besitzen. Wie viele Komponenten vorhanden sind, ist dementsprechend dynamisch, die Anzahl der Werte nicht.
    Sobald eine Komponente erstellt wird, wird sie in einer XML abgespeichert. Bei Programmstart werden die Komponenten aus der Datei wieder eingelesen.

    Wie habe ich es bisher versucht?

    Vorerst habe ich meine Komponenten in eine List gespeichert und in eine XML geschrieben. Das funktioniert soweit problemlos.
    Beim Einlesen erscheint allerdings ein Fehler, dass es mehr Einträge gibt als vorgesehen. Ich nehme daher an, dass irgendwas an der Formatierung der XML nicht richtig ist.

    So sollten die Daten am besten aussehen, wenn sie erneut eingelesen werden:

    VB.NET-Quellcode

    1. [0] Wert1; Wert2; Wert3; Wert4; Wert5; Wert6; Wert7
    2. [1] Wert1; Wert2; Wert3; Wert4; Wert5; Wert6; Wert7
    3. [2] Wert1; Wert2; Wert3; Wert4; Wert5; Wert6; Wert7
    4. [3] Wert1; Wert2; Wert3; Wert4; Wert5; Wert6; Wert7
    5. usw.


    Wie sieht meine List aus?
    Ich habe eine eigene Klasse erstellt, in der folgendes erhalten ist:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Xml.Serialization
    3. <XmlRoot>
    4. Public Class Komponenten
    5. <XmlElement("Komponente")>
    6. Public Property List As New List(Of KomponentenWerte)
    7. End Class
    8. Public Class KomponentenWerte
    9. Public Bezeichnung As String
    10. Public KomponentenNr As UShort
    11. Public Werk As UShort
    12. Public Zeit As String
    13. Public Einheit As String
    14. Public pEinheit As UShort
    15. Public Preis As Decimal
    16. End Class


    Wie ich die Daten in die XML schreibe:

    VB.NET-Quellcode

    1. Public Sub WriteXML()
    2. Dim KomponentenWert As New KomponentenWerte() With
    3. {
    4. .Bezeichnung = "TestKomponente",
    5. .Einheit = "kg",
    6. .pEinheit = 1000,
    7. .Preis = CDec("5,50"),
    8. .Werk = 123,
    9. .Zeit = "29.06.2022"
    10. }
    11. Dim Komponente As New Komponenten()
    12. Komponente.List.Add(KomponentenWert)
    13. Dim writer As New XmlSerializer(GetType(Komponenten))
    14. Dim file As New StreamWriter(Application.StartupPath & "Komponenten.xml", True)
    15. writer.Serialize(file, Komponente)
    16. file.Close()
    17. End Sub


    Folgendes wird in die XML geschrieben:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Komponenten xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <Komponente>
    4. <Bezeichnung>TestKomponente</Bezeichnung>
    5. <KomponentenNr>0</KomponentenNr>
    6. <Werk>123</Werk>
    7. <Zeit>29.06.2022</Zeit>
    8. <Einheit>kg</Einheit>
    9. <pEinheit>1000</pEinheit>
    10. <Preis>5.50</Preis>
    11. </Komponente>
    12. </Komponenten>


    Wie ich die XML Importiere:

    VB.NET-Quellcode

    1. Sub Import()
    2. Dim Komponenten = New Komponenten()
    3. Dim serializer As New XmlSerializer(GetType(Komponenten))
    4. Using reader As New StreamReader(Application.StartupPath & "Komponenten.xml")
    5. Komponenten = DirectCast(serializer.Deserialize(reader), Komponenten)
    6. End Using
    7. End Sub


    Welche Daten ich bekomme:

    VB.NET-Quellcode

    1. [b]
    2. [/b]Komponenten.count = 1
    3. [0] -> Bezeichnung = TestKomponente ,Einheit = kg, pEinheit = 1000, Preis = 5,50, Werk = 123, Zeit = 29.06.2022[b]

    [/b]
    Soweit so gut. Genau so soll es sein. Nun führe ich den Sub WriteXML() erneut aus.

    Meine XML:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Komponenten xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <Komponente>
    4. <Bezeichnung>TestKomponente</Bezeichnung>
    5. <KomponentenNr>0</KomponentenNr>
    6. <Werk>123</Werk>
    7. <Zeit>29.06.2022</Zeit>
    8. <Einheit>kg</Einheit>
    9. <pEinheit>1000</pEinheit>
    10. <Preis>5.50</Preis>
    11. </Komponente>
    12. </Komponenten><?xml version="1.0" encoding="utf-8"?>
    13. <Komponenten xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    14. <Komponente>
    15. <Bezeichnung>TestKomponente2</Bezeichnung>
    16. <KomponentenNr>123</KomponentenNr>
    17. <Werk>123</Werk>
    18. <Zeit>29.06.2022</Zeit>
    19. <Einheit>t</Einheit>
    20. <pEinheit>1</pEinheit>
    21. <Preis>5.50</Preis>
    22. </Komponente>
    23. </Komponenten>


    Nun der Fehler:

    Das Ausführen von Import() führt zu einem Fehler beim Punkt

    VB.NET-Quellcode

    1. Komponenten = DirectCast(serializer.Deserialize(reader), Komponenten)

    Innere Aushahme: XmlException: Unerwartete XML-Deklaration. Die XML-Deklaration muss der erste Knoten im Dokument sein. Davor sind keine Leerzeichen zulässig. Zeile 12, Position 17.

    Wunderbar wäre es, wenn er die Daten nun einfach in eine neue Reihe schieben würde, quasi:

    VB.NET-Quellcode

    1. Komponenten.count = 2
    2. [0] -> Bezeichnung = TestKomponente ,Einheit = kg, pEinheit = 1000, Preis = 5,50, Werk = 123, Zeit = 29.06.2022
    3. [1] -> Bezeichnung = TestKomponente ,Einheit = kg, pEinheit = 1000, Preis = 5,50, Werk = 123, Zeit = 29.06.2022


    Das ist vermutlich auch nicht so schwierig, allerdings bin ich mit meinen Ansätzen und Google Versuchen am Ende
    ?(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Silvergreen“ ()

    Du verwendest in der Zeile Dim file As New StreamWriter(Application.StartupPath & "Komponenten.xml", True) mit dem Boolean-Parameter die Append-Version. Will heißen: Der Dateiinhalt wird nicht ersetzt, sondern ergänzt. Und das ist falsch. Mach das True weg und versuch es nochmal.

    btw: Dim Komponente As New Komponenten() - Also mit der Benennung schießt Du Dir vom Verständnis her echt ins eigene Knie.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    (Fast-)Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Genau, da er sonst den vorherigen Eintrag ersetzt. Ich möchte ja das es mehrere Einträge gibt wie oben kurz gezeigt




    Ich habe mich nun dazu entschieden ein Datatable statt eine List zu nutzen. Die Komponenten kann ich dort einfach hinterlegen und per

    VB.NET-Quellcode

    1. DataTable.WriteXML()
    noch einfacher in einer XML abspeichern

    Beiträge zusammengefasst ~VaporiZed
    ?(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()