verschachtelte XML in dictionary einlesen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von freelancer.

    verschachtelte XML in dictionary einlesen

    Ich schreibe erfolgreich eine XML Datei mit diesem Code weg:

    VB.NET-Quellcode

    1. Public Sub SaveNestedXmlFile(ByVal file As String, ByVal key1Name As String, ByVal key2Name As String, ByVal attributeName As String, ByVal dictionaryName As Dictionary(Of String, Dictionary(Of String, String)))
    2. Dim xw As XmlTextWriter = New XmlTextWriter(file, New UnicodeEncoding)
    3. xw.WriteStartDocument()
    4. xw.WriteStartElement(key1Name)
    5. Dim x As Integer = 0
    6. For Each pair In dictionaryName
    7. xw.WriteStartElement("id" & pair.Key)
    8. For Each subpair In pair.Value
    9. Dim k2 As String = subpair.Key
    10. Dim v2 As String = subpair.Value
    11. xw.WriteStartElement(attributeName)
    12. xw.WriteAttributeString(k2, v2)
    13. xw.WriteEndElement()
    14. Next
    15. xw.WriteEndElement()
    16. x = x + 1
    17. Next
    18. xw.WriteEndElement()
    19. xw.Close()
    20. LogInfo("saved nested XML file: " & file)
    21. End Sub


    und möchte die XML nun wieder in ein dictionary im dictionary einlesen:

    VB.NET-Quellcode

    1. Public Sub ReadNestedXmlFile(ByVal file As String, ByVal dictionaryName As Dictionary(Of String, Dictionary(Of String, String)))
    2. ' Lesen einer "verschachtelten" XML Datei
    3. If Not My.Computer.FileSystem.FileExists(file) Then
    4. MsgBox("Die angebenen Datei '" & file & "' konnte nicht gefunden werden")
    5. Exit Sub
    6. End If
    7. Dim xr As XmlReader = New XmlTextReader(file)
    8. Do While xr.Read()
    9. If xr.NodeType = XmlNodeType.Element Then
    10. If xr.AttributeCount > 0 Then
    11. Do While xr.MoveToNextAttribute()
    12. dictionaryName(xr.Name) = xr.Value
    13. Loop
    14. End If
    15. End If
    16. Loop
    17. xr.Close()
    18. LogInfo("imported XML file: " & ExtractFilename(file))
    19. End Sub



    In der Loop, zwischen Zeile 18 und 34 bekommen ich die Zuweisung zum dictionary im dictionary nicht hin. Die hier aufgeführte Loop funktioniert einwandfrei für ein "einfaches" dictionary. Kann mir jemand auf die Sprünge helfen?
    Ja, ein

    Quellcode

    1. Dictionary.Add
    muss auf jeden Fall gemacht werden. Sicherlich in Zeile 21. Die XML Datei sieht so aus:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-16"?><Participants><id1111><Attribute Lastname="1" /><Attribute Firstname="11" /><Attribute Club="111" /><Attribute Id="1111" /><Attribute Ranking="" /><Attribute PerformanceClass="11111" /><Attribute Birthday="111111" /><Attribute Email="1111111" /><Attribute State="NTV - Niedersächsischer Tennisverband e.V." /><Attribute Mobil="" /><Attribute Phone="" /><Attribute Street="" /><Attribute ZipCode="" /><Attribute Place="" /><Attribute Remarks="" /></id1111><id2222><Attribute Lastname="2" /><Attribute Firstname="22" /><Attribute Club="222" /><Attribute Id="2222" /><Attribute Ranking="" /><Attribute PerformanceClass="22222" /><Attribute Birthday="222222" /><Attribute Email="2222222" /><Attribute State="NTV - Niedersächsischer Tennisverband e.V." /><Attribute Mobil="" /><Attribute Phone="" /><Attribute Street="" /><Attribute ZipCode="" /><Attribute Place="" /><Attribute Remarks="" /></id2222>


    Ich habe beim XML Reader nicht verstanden wofür

    Quellcode

    1. xr.NodeType = XmlNodeType.Element
    stehen bzw. wie ich mir ausgeben lassen kann, welches XML Element gerade abgearbeitet wird. Dann brauche ich ja sicherlich noch eine zweite Schleife für die darunter liegenden Elemente ......
    @freelancer zur XML-Serialisierung und -Deserialisierung eines Dictionaries gugst Du hier (class SerializableDictionary).
    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!
    Ach Leute, so viel neue Sachen .......

    Ich komme mit dem lesen gar nicht nach und fühle mich auch noch ziemlich unsicher. Aber das wird schon noch ;)

    Ich habe mir nun mit diesem Code geholfen:

    VB.NET-Quellcode

    1. Public Sub ReadNestedXmlFile(ByVal file As String, ByVal dictionaryName As Dictionary(Of String, Dictionary(Of String, String)))
    2. ' Lesen einer "verschachtelten" XML Datei
    3. Dim key1 As String ' key für dictionary
    4. If Not My.Computer.FileSystem.FileExists(file) Then
    5. MsgBox("Die angebenen Datei '" & file & "' konnte nicht gefunden werden")
    6. Exit Sub
    7. End If
    8. Dim xr As XmlReader = New XmlTextReader(file)
    9. Do While xr.Read()
    10. If xr.NodeType = XmlNodeType.Element Then
    11. If Not (xr.Name = "Participants" Or xr.Name = "Attribute") And xr.NodeType = 1 Then
    12. key1 = xr.Name
    13. dictionaryName.Add(key1, New Dictionary(Of String, String)) ' alle Teilnehmerdaten mit fortlaufender Nummer abspeichern
    14. End If
    15. If xr.AttributeCount > 0 Then
    16. Do While xr.MoveToNextAttribute()
    17. dictionaryName(key1).Add(xr.Name, xr.Value)
    18. Loop
    19. End If
    20. End If
    21. Loop
    22. xr.Close()
    23. LogInfo("imported XML file: " & ExtractFilename(file))
    24. End Sub


    Wirklich uncool finde ich die Abfrage in Zeile If Not (xr.Name = "Participants" Or xr.Name = "Attribute") And xr.NodeType = 1 Then. Da muss ich natürlich noch stark drüber nachdenken.

    Aber ..... ich habe das dictionary gefüllt! Nur, schön und sauber programmieren ist etwas anderes!!!!!!