XML Dokument auslesen

  • VB.NET

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

    XML Dokument auslesen

    Hallo,

    ich habe eine funktion gebastelt welche mir einstellungen von meinem Programm in eine XML Datei speichert. Jetzt möchte ich die auch wieder einlesen ... nur weis ich nicht ganz wie

    im anhang meine xml datei.

    Das problem ist, dass man mittels einem xmlreader nicht erkennen würde wo man gerade ist, da es meherer abschnitte in der xml datei gibt welche mit einer schleife geschrieben wurden ...

    ist LINQ to XML eine idee ?

    Wie würdet ihr da ran gehen ?

    Gruß
    Dateien
    Wahrscheinlich nicht gerade die beste Ausführung aber es funktioniert ^^

    VB.NET-Quellcode

    1. Public Sub load_messurements()
    2. Dim xmlDoc As New XmlDocument
    3. Dim root As XmlElement
    4. If File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\TDA\messurement_default.xml") Then
    5. xmlDoc.Load(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\TDA\messurement_default.xml")
    6. root = xmlDoc.DocumentElement
    7. For Each MesNode As XmlNode In root.ChildNodes
    8. Dim mes As New messurement
    9. mes.typeName = Replace(MesNode.Name, "_", " ")
    10. For Each Node As XmlNode In MesNode.ChildNodes
    11. Select Case Node.Name
    12. Case "name"
    13. mes.name = Node.InnerText
    14. Case "type"
    15. mes.type = Node.InnerText
    16. Case "InnerText1"
    17. mes.value1 = Node.InnerText
    18. Case "InnerText2"
    19. mes.value2 = Node.InnerText
    20. Case "limit"
    21. mes.limit = Node.InnerText
    22. Case "way_min"
    23. mes.way_min = Node.InnerText
    24. Case "way_max"
    25. mes.way_max = Node.InnerText
    26. Case "fraction"
    27. mes.fraction = CBool(Node.InnerText)
    28. Case "v_deviation"
    29. mes.v_deviation = Node.InnerText
    30. Case "ref_deviation"
    31. mes.ref_deviation = Node.InnerText
    32. Case "deviation"
    33. mes.deviation = Node.InnerText
    34. Case "konst_time"
    35. mes.konst_time = Node.InnerText
    36. Case "direction"
    37. mes.direction = CBool(Node.InnerText)
    38. Case "offset"
    39. mes.offset = Node.InnerText
    40. Case "offset_type"
    41. mes.offset_type = Node.InnerText
    42. Case "updown"
    43. mes.updown = CBool(Node.InnerText)
    44. Case "ref_channel"
    45. mes.ref_channel = channels.Item(Node.InnerText)
    46. Case "data_channel"
    47. mes.data_channel = channels.Item(Node.InnerText)
    48. Case "calculation"
    49. Dim cal As calculate
    50. For Each CalNode As XmlNode In Node.ChildNodes
    51. cal = New calculate(CInt(Mid(CalNode.Name, 5)))
    52. For Each calPropNode As XmlNode In CalNode.ChildNodes
    53. Select Case calPropNode.Name
    54. Case "columns"
    55. cal.column.AddRange(Split(calPropNode.InnerText, ";"))
    56. Case "operators"
    57. cal.operators.AddRange(Split(calPropNode.InnerText, ";"))
    58. End Select
    59. Next
    60. mes.calculation.Add(cal)
    61. Next
    62. End Select
    63. Next
    64. messurements.Add(mes.typeName, mes)
    65. Next
    66. Else
    67. MsgBox("Konfiguration konnte nicht geladen werden." & vbNewLine & vbNewLine & Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\TDA\messurement_default.xml" & " ist nicht verfügbar!", MsgBoxStyle.Critical, "Fehler")
    68. End If
    69. End Sub
    Mit einem typisierten Dataset ginge das auch in 10 Zeilen.
    Tatsächlich scheint es sich doch nicht um eine Konfiguration im eigentlichen Sinne zu handeln, sonder um eine Tabelle von MessDaten.
    Die Datensätze sind sogar recht gut erkennbar in ihren Eigenschaften, nur das Calculations-Dingens würde im Dataset wohl als untergeordnete Tabelle modelliert.
    Nein es handelt sich nicht um Mess-Daten man kann eher sagen um die Konfiguration wie die Messungen durchgeführt werden sollen ... also Parameter ...

    ich habe mir die möglichkeit der XML-Serialisierung angesehen aber war mir jetzt ein bisschen zu undurchsichtig, da ich die funktion des rauschreibens der daten schon geschrieben hatte.
    mist da kommt ein Problem auf ...

    ich habe in meinem eigentlichen Projekt vieles mit Dictionary gemacht ... leider scheint aber Dictionary sich nicht serialisieren zu lassen ... gibts es da einen trick oder muss ich meine Dictionaries in eine List umbauen ?

    Gruß

    ..............................................................................

    hmm coole sache muss ich schon sagen ^^

    VB.NET-Quellcode

    1. Imports System.Xml
    2. Imports System.Xml.Serialization
    3. Public Class frm_Main
    4. Private settings As New List(Of setting)
    5. Private Sub frm_Main_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    6. settings.Add(New setting("Test1", {"Hallo", "du", "da!"}))
    7. settings.Add(New setting("Test2", {"Hallo", "du", "da!"}))
    8. settings.Add(New setting("Test3", {"Hallo", "du", "da!"}))
    9. settings.Add(New setting("Test4", {"Hallo", "du", "da!", "muhahaa"}))
    10. End Sub
    11. Private Sub btn_serialize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_serialize.Click
    12. Dim writer As XmlWriter
    13. Dim ser As XmlSerializer = New XmlSerializer(GetType(List(Of setting)))
    14. writer = New XmlTextWriter("C:\Dokumente und Einstellungen\pr1eg33\Desktop\test.xml", New System.Text.UTF8Encoding())
    15. Try
    16. ser.Serialize(writer, settings)
    17. Catch ex As Exception
    18. MsgBox(ex.ToString)
    19. Finally
    20. writer.Close()
    21. End Try
    22. End Sub
    23. End Class


    Danke ;)

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