Mehrdimensionalen Array in XML ein- und auslesen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Mehrdimensionalen Array in XML ein- und auslesen

    Hi Leute,

    ich arbeite gerade an einem Projekt bei dem ich mehrere Arrays gerne in einer Datenbank speichern würde,
    aus der ich sie dann auch wieder auslesen kann. Die Arrays sind 2- oder 3-dimensional und bestehen faktisch
    aus Integern und Strings (ist dann in 2 Arrays, einer mit Integern, der andere mit Strings realisiert), die mit neuen
    Eingaben des Benutzers dynamisch mitwachsen.
    Ein solcher beispielsweise 2-dimensionaler Array sieht wie folgt aus:
    Namenarray(0, 1) = Name (als String)
    Namenarray(0, 2) = Beschreibung (als String)
    Wertearray(0, 1) = Wert1 (als Integer)
    Wertearray(0, 2) = Wert2 (als Integer)
    .
    .
    .

    Am liebsten wäre mir XML, da ich so die Datenbank automatisch
    per Dropbox mit den anderen Nutzern synchronisieren könnte. Ich bin aber auch offen für andere gute Vorschläge.

    Hier zu meinem Problem:
    Wie schaffe ich es, dass mein Programm die Arrays in einer (oder mehrerer) XML-Datei abspeichert?
    Das Auslesen, denke ich, schaffe ich sobald ich die XML-Datei zum dynamischen mitwachsen bekommen habe :D
    Man könnte die eine Dimension als Elemente darstellen, die zweite dann als Attribute?

    <mehrdim wert1=",,," wert2="..."/>
    <mehrdim wert1=",,," wert2="..."/>

    Und so weiter eben...Hm, und dann den ganzen Kram vielleicht in ne List(Of Tuple) (msdn.microsoft.com/de-de/library/vstudio/system.tuple.aspx) schreiben?
    Dann hättest du die auch wunderbar kombiniert, und List(of ..) ist nun wirklich ein nettes Ding ;)

    //Code:
    So würde ich das glaube ich lösen:

    VB.NET-Quellcode

    1. 'hinzufügen
    2. Dim xmllist As New List(Of Tuple(Of String, String, Integer, Integer))
    3. xmllist.Add(Tuple.Create("blubb", "blaa", 2039, 2039))
    4. 'speichern
    5. Dim xmldoc As XDocument = New XDocument(<tuplelist></tuplelist>) 'Neu schreiben
    6. 'Dim xmldoc As XDocument = XDocument.Load("mysave.xml")'Vorhandene laden
    7. For Each e In xmllist
    8. Dim thiselmnt As New XElement("tuplenode")
    9. thiselmnt.Add(New XAttribute("w1", e.Item1))
    10. thiselmnt.Add(New XAttribute("w2", e.Item2))
    11. thiselmnt.Add(New XAttribute("w3", e.Item3))
    12. thiselmnt.Add(New XAttribute("w4", e.Item4))
    13. xmldoc.Root.Add(thiselmnt)
    14. Next
    15. 'lesen
    16. 'Dim xmldoc As XDocument = XDocument.Load("mysave.xml")'Vorhandene laden
    17. For Each e In xmldoc.Root.Elements
    18. xmllist.Add(Tuple.Create(e.Attribute("w1").Value, _
    19. e.Attribute("w2").Value, _
    20. CInt(e.Attribute("w3").Value), _
    21. CInt(e.Attribute("w4").Value)))
    22. Next


    Sicher nicht sauber, und vorallem keinerlei Prüfung, was da an Werten reingeht (Attribute könnten fehlen, CInt könnte falsche Werte bekommen...)
    Aber müsste so funktionieren, wenn auch nicht getestet...

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

    Also das Tool, das ich gerade programmiere, ist ein nützlicher Helfer bei einem Pen&Paper.
    In den Arrays stehen in erster Linie die Charaktere und deren Werte. Da ich nicht weiß, wie
    viele das werden, habe ich als erstes an dynamische Arrays gedacht. Mehr als 100 werden es
    aber bestimmt nicht, um mal die Größe abzustecken.
    Das Problem stellen auch weniger die unterschiedlichen Arten der Daten in den Arrays dar, als
    vielmehr das Speichern in einer Datenbank an sich.
    Ist es überhaupt möglich 3-dimensionale Arrays unkompliziert zu speichern? Ansonsten müsste ich
    da wohl noch eine andere Möglichkeit finden.
    also ich hab jetzt p&p auf wiki nachgelesen, es sind wohl Charaktere und ihre Eigenschaften.
    Das wären einfache Datensätze in einem typisierten Dataset.

    kein Problem eine Tabelle aller möglichen Charakter-Eigenschaften zu designen, und ein paar Figuren in dieser Tabelle anzulegen, und iwelche Stärke-Zahlen pro Eigenschaft zuzuweisen.
    gugge Daten laden, speichern, verarbeiten

    das wäre aber nur 2-dimensional - wieso meinst du 3d-Arrays zu benötigen?
    3-d Arrays wären praktisch, wenn es darum geht einem Charakter spezifische Ausrüstung (und deren Werte als 3. Dimension) einzufügen.
    Ich habe allerdings schon nachgedacht und könnte das Problem durchaus umgehen, falls es als 2-d Arrays wirklich wesentlich leichter zu
    programmieren wäre.
    Eine weitere Sache ist mir tatsächlich noch eingefallen, nachdem ich dein Tutorial gelesen hatte.
    1. Ist es möglich Daten auch aus einem Array anstelle eines DatagridViews auszulesen?
    Den DatagridView an sich finde ich etwas unpraktisch, da er eine vorgegebene Zahl von Spalten hat, etc.
    Ich möchte die Daten gerne verarbeiten, ohne sie danach zwangsläufig dauerhaft zu übernehmen, was
    wiederrum eher für das Arrayformat sprechen würde.

    Qualla schrieb:

    3-d Arrays wären praktisch, wenn es darum geht einem Charakter spezifische Ausrüstung (und deren Werte als 3. Dimension) einzufügen.
    hier betrittst du die Welt der relationalen Datenmodellierung. Gugge die relationale GrundIdee
    So wie dort dem Gustav mehrere Berufe zuordnebar sind, so müssen bei P&P einem Charakter mehrere Ausrüstungsgegenstände zuordnebar sein.
    Mit Arrays kommst du da nicht mehr klar, sondern das geht garnet mehr ohne typDataset (oder Alternative, aber die sind dünn gesät).
    Vielen Dank schonmal für die vielen Informationen.
    Ich habe mein Tool jetzt so strukturiert, dass ich einige "gewöhnliche" dynamische 2d-Arrays benutze, die ich gerne bei beenden des Programms speichern
    und beim nächsten Öffnen wieder laden möchte. Könnte mir jemand ein Beispiel geben, wie genau ich es von einem Array in eine XML-Datei schaffe, die
    zusammen mit dem Array dann auch mitwachsen wird? Der Rest dürfte kein Problem sein, ich kenne mich nur leider bei Datenbanken wirklich nicht sehr gut
    aus.
    Da musst du dir eine xml-serialisierbare Klasse erschaffen.

    glaub mir, das ist vlt. ebenso aufwändig, wie sich das typDataset-KnowHow anzueignen, und leistet u.U. nichtmal, was du brauchst.
    und inne Anwendung isses jedesmal exorbitant viel umständlicher (wenns leistungsmäßig ühaupt hinreicht).

    Übrigens: eine Datenbank braucht das typDataset nicht.
    Hi Leute,
    ich habe mich jetzt mal an einer Speichermöglichkeit versucht und zuerst klappt auch alles so wie geplant,
    allerdings nur bis zum ersten im folgenden abgebildeten Private Sub:

    VB.NET-Quellcode

    1. Private Sub Kampftool_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim fs As FileStream = File.OpenRead("Zaubernamen.bin") ' Datei zum Lesen öffnen
    3. Dim bf As New BinaryFormatter()
    4. Dim Zaubernamen_liste As String(,) = bf.Deserialize(fs) ' Laden/Deserialisieren
    5. fs.Dispose() ' Datei freigeben
    6. ZLänge = UBound(Zaubernamen_liste, 2)
    7. For i = 1 To ZLänge
    8. ZauberListe.Items.Add(Zaubernamen_liste(1, i))
    9. Next
    10. MessageBox.Show("Daten wurden erfolgreich geladen.")
    11. End Sub


    Alle Daten werden geladen und in der Listbox Zauberliste auch richtig angezeigt.
    Dabei gibt es folgendes Problem:
    Schon im nächsten Sub kann sich der Code nicht mehr an die Werte im Array Zaubernamen_liste(,) erinnern,
    soll heißen er setzt alle auf Nothing/0. An den Integer ZLänge erinnert er sich komischerweise tatsächlich schon.
    Woran könnte das liegen?

    Qualla schrieb:

    Woran könnte das liegen?

    am Gültigekeitsbereich.

    Der Gültigekeitsbereich (Scope) ist ein Kern-Konzept von OOP, also bitte dieses Buch lesen (hingegen das Galileio-Openbook ist Mist), damit dus richtig und im Zusammenhang mit den anneren Kernkonzepten lernst.
    Das Problem ist mir normalerweise schon bekannt, weshalb ich alle Arrays, die ich in mehreren Private Subs verwende vorher in der übergeordneten Public Class vordeklariere.

    VB.NET-Quellcode

    1. Public Class Kampftool
    2. Dim Zauber_liste(,) As Integer
    3. Dim Zaubernamen_liste(,) As String
    4. Dim ZLänge


    So in etwa sieht das bei mir dann aus.
    Mit Redim Preserve bearbeite ich den Array dann in den nachfolgenden Private Subs weiter.
    Das hat bei mir bisher immer gut geklappt, bis auf diese Ausnahme. Wo genau liegt also das Problem?

    Qualla schrieb:

    Das Problem ist mir normalerweise schon bekannt, weshalb ich alle Arrays, die ich in mehreren Private Subs verwende vorher in der übergeordneten Public Class vordeklariere.
    Jedoch dieses ZauberListen-Array deklarierst du ausserdem nochmal lokal, wodurch die gleichnamige Klassenvariable abgeschirmt ist (womit wir wieder beim Thema Gültigkeitsbereich wären)