XML Serialisieren - Verständnis Problem bei Relations

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    XML Serialisieren - Verständnis Problem bei Relations

    Hi,
    ich bin gerade dabei eine Import Funktion in mein Programm einzubauen.
    Erstmal zum Hintergund:
    ich hatte vor einiger Zeit ein Programm geschrieben um Text Schnipsel zu speichern Snipps (siehe Signatur).
    Nun möchte ich Snipps neu schreiben und um einige Funktionen erweitern.
    Dazu gehört die Importfunktion der XML Datei, die Snipps erstellt (siehe Anhang).
    Da sich im neuen Snipps die Datenstruktur ändert, möchte ich das "alte" XML ins neue Dataset importieren.
    Dazu habe ich mir eine Sub geschrieben, die folgendermaßen aussieht:

    VB.NET-Quellcode

    1. Private Sub ImportSnippets(ByVal oldXML As String)
    2. Dim _Snippets As XDocument = XDocument.Load(oldXML)
    3. Dim _GetCat As IEnumerable(Of DataSetSnipps.Category)
    4. Dim _GetSnip As IEnumerable(Of DataSetSnipps.Snippets)
    5. _GetCat = From c In _Snippets.Descendants("Category")
    6. Select New DataSetSnipps.Category With
    7. {.catDescription = c.Element("Description").Value}
    8. _GetSnip = From s In _Snippets.Descendants("Snippets")
    9. Select New DataSetSnipps.Snippets With
    10. {.snipSnippetInfo = s.Element("SnippetInfo").Value,
    11. .snipSnippet = s.Element("Snippet").Value}
    12. For Each cat As DataSetSnipps.Category In _GetCat
    13. For Each snip As DataSetSnipps.Snippets In _GetSnip
    14. Dts.ProjektOrdner.AddProjektOrdnerRow(cat.catDescription)
    15. Dts.ProjektDatei.AddProjektDateiRow(cat.catID, snip.snipSnippetInfo, snip.snipSnippet)
    16. Next
    17. Next
    18. End Sub

    dazu eine Klasse DatasetSnipps und deren Unterklassen:

    VB.NET-Quellcode

    1. Public Class DataSetSnipps
    2. Public Class Category : Inherits DataSetSnipps
    3. Public catID As Integer
    4. Public catDescription As String
    5. End Class
    6. Public Class Snippets : Inherits Category
    7. Public snipID As Integer
    8. Public snipSnippetInfo As String
    9. Public snipSnippet As String
    10. Public snipCategoryID As Integer
    11. End Class
    12. End Class


    Nun ist es so, das zwischen Category und Snippets eine Relation besteht (CategoryID), diese Relation gibt es so auch in der neuen Struktur. (ProjektOrdnerID)

    Mein Problem ist nun, wie füge ich die neue ProjektDatei Row ein, mit Beziehung zu der vorher erstellten neuen ProjektOrdner Row?
    Dts.ProjektOrdner.AddProjektOrdnerRow(cat.catDescription) Dts.ProjektDatei.AddProjektDateiRow(hier muss der Bezug zur ehemaligen Category (jetzt ProjektOrdner) ID hin, snip.snipSnippetInfo, snip.snipSnippet)
    Danke für Eure Tips

    EDIT:
    mein Problem liegt schon vorher. Die XML Knoten werden erst garnicht ausgelesen :(
    Dateien
    • DSSnipps.xml

      (21,01 kB, 250 mal heruntergeladen, zuletzt: )
    "Hier könnte Ihre Werbung stehen..."

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

    Alos, das Einlese Problem habe ich schon einmal behoben:

    VB.NET-Quellcode

    1. Public Sub ImportSnippets(ByVal oldXML As String)
    2. Dim _Snippets As XElement = XElement.Load(oldXML)
    3. Dim Categorys = From Category In _Snippets.Elements("Category")
    4. Select Category.<Description>
    5. Dim Snippets = From Snippet In _Snippets.Elements("Snippets")
    6. Select Snippet.<SnippetInfo>, Snippet.<Snippet>
    7. For Each snip In Snippets
    8. For Each cat In Categorys
    9. Dts.ProjektOrdner.AddProjektOrdnerRow(cat.Value)
    10. Dts.ProjektDatei.AddProjektDateiRow(??, snip.SnippetInfo.Value, snip.Snippet.Value)
    11. Next
    12. Next
    13. End Sub

    Jetzt fehlt mir nur noch die Zuordnung der Untertabelle Snippets zu Category.... (?? im AddRow-Code)
    "Hier könnte Ihre Werbung stehen..."
    Das hat doch nur sehr entfernt mit Serialisieren zu tun.
    Das ist manuelle XML-Auswertung.
    Serialisieren / Deserialisieren geht so:
    msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx
    msdn.microsoft.com/en-us/library/182eeyhh(v=vs.110).aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo @petaod,
    Danke für die Links, die hatte ich beide schon durch geackert. Fand das allerdings für dieses "kleine Vorhaben" zu überdimensioniert.
    Im Grunde steht der Code soweit ja auch, nur das ich es einfach nicht hin bekomme, in 2 verschachtelten Schleifen die Rows zur Tabelle hinzuzufügen, da ja eine Relation besteht.
    hier mal der Code, wie es im Moment aussieht:

    VB.NET-Quellcode

    1. Public Sub ImportSnippets(ByVal oldXML As String)
    2. Dim _Import As XElement = XElement.Load(oldXML)
    3. Dim _ProjectFolder = From Cat In _Import.Elements("Category")
    4. Select Cat.<Description>
    5. Dim _ProjectFile = From Snip In _Import.Elements("Snippets")
    6. Select Snip.<SnippetInfo>, Snip.<Snippet>
    7. For Each oldCat In _ProjectFolder
    8. Dts.ProjektOrdner.AddProjektOrdnerRow(oldCat.Value)
    9. For Each oldSnip In _ProjectFile
    10. Dts.ProjektDatei.AddProjektDateiRow(??, oldSnip.SnippetInfo.Value, oldSnip.Snippet.Value)
    11. Next
    12. Next
    13. End Sub

    mein Problem ist die Stelle Dts.ProjektDatei.AddProjektDateiRow(??, oldSnip.SnippetInfo.Value, oldSnip.Snippet.Value)
    Es wird eine ProjektOrdnerRow erwartet, weil die ProjectID ja zur übergeordneten Tabelle passen muss.
    Ich hab einiges versucht, mit Casten usw. aber ich bekomme es einfach nicht hin.
    Hättest Du oder jemand nen Tip wie ich die beiden Rows hinzufügen kann?
    Danke
    "Hier könnte Ihre Werbung stehen..."
    Hi,
    ganz Klar, der Rückgabewert ist in dem Falle eine ProjektOrdnerRow
    Nur dann versteh ich wohl meine Schleifen falsch, denn die neu hinzugefügten Childrows werden alle unter den ersten eintrag der parentrow hinzugefügt
    Hmmm... ich hatte das auch genau schon so gehabat und die Schleifen hin und her verschachtelt, aber wohl nicht verstanden :(
    Jetziger Code ist so:

    VB.NET-Quellcode

    1. Public Sub ImportSnippets(ByVal oldXML As String)
    2. Dim _Import As XElement = XElement.Load(oldXML)
    3. Dim _ProjectFolder = From Cat In _Import.Elements("Category")
    4. Select Cat.<Description>
    5. Dim _ProjectFile = From Snip In _Import.Elements("Snippets")
    6. Select Snip.<SnippetInfo>, Snip.<Snippet>
    7. For Each oldCat In _ProjectFolder
    8. Dim parentRow = Dts.ProjektOrdner.AddProjektOrdnerRow(oldCat.Value)
    9. For Each oldSnip In _ProjectFile
    10. Dts.ProjektDatei.AddProjektDateiRow(parentRow, oldSnip.SnippetInfo.Value, oldSnip.Snippet.Value)
    11. Next
    12. Next
    13. End Sub
    "Hier könnte Ihre Werbung stehen..."
    Ah - dein Linq ruft alle Snippets des Documents auf einmal ab.
    du solltest aber jeweils nur die Snippets eines Category-Xelementes abrufen, in der verschachtelten schleife.

    Aber ich kenne auch nicht den genauen Aufbau deiner xml, ob da tatsächlich die snippets in die Categories eingeschachtelt sind.
    Nee, die sind nicht eingeschachtelt, sind ja 2 Tabellen, 1 mal Category und einmal Snippet und über eine Relation verknüppft. ID von Categroy zu CategoryID in Tabelle snippet.
    Ich denke mir, das es so wahrscheinlich nicht geht, weil beim Hinzufügen ja irgendwei der Bezug fehlt. Ich hatte auch versucht bei LinQ mit Where zu arbeiten, aber das scheints nicht zu geben...
    Ich muss ja irgendwie die Struktur wieder genauso hin bekommen, nur eben das die beiden Tabellen und Spalten nu anders heißen.
    Ich häng das Projekt und die einzulesende XML mal an, vielleicht finden wir dann ne Lösung... (nur nicht hauen wenn ich Blödsinn gemacht hab :) )
    Dateien
    • SnippsCode00.zip

      (44,66 kB, 190 mal heruntergeladen, zuletzt: )
    • DSSnipps.xml

      (21 kB, 247 mal heruntergeladen, zuletzt: )
    "Hier könnte Ihre Werbung stehen..."
    Yeahh, ich hab es hin bekommen.
    Ich ziehe mir nun einfach beim Einlesen die beiden ID Spalten mit und gucke, ob die CategroyID der Untertabelle mit der ID der Obertabelle übereinstimmt und füge dann die Row hinzu. Klappt wunderbar:

    VB.NET-Quellcode

    1. Public Sub ImportSnippets(ByVal oldXML As String)
    2. Dim _Import As XElement = XElement.Load(oldXML)
    3. Dim _ProjectFolder = From Cat In _Import.Elements("Category")
    4. Select Cat.<Description>, Cat.<ID>
    5. Dim _ProjectFile = From Snip In _Import.Elements("Snippets")
    6. Select Snip.<SnippetInfo>, Snip.<Snippet>, Snip.<CategoryID>
    7. For Each oldCat In _ProjectFolder
    8. Dim parentRow = Dts.ProjektOrdner.AddProjektOrdnerRow(oldCat.Description.Value)
    9. For Each oldSnip In _ProjectFile
    10. If oldSnip.CategoryID.Value = oldCat.ID.Value Then
    11. Dts.ProjektDatei.AddProjektDateiRow(parentRow, oldSnip.SnippetInfo.Value, oldSnip.Snippet.Value)
    12. End If
    13. Next
    14. Next
    15. End Sub

    Problem gelöst :)
    "Hier könnte Ihre Werbung stehen..."