Xml Datei Serialisieren

  • VB.NET

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

    Xml Datei Serialisieren

    Guten Morgen,
    ich versuche derzeit eine Xml Datei zu serialisieren, die dazugehörigen Klassen habe ich soweit möglich erstellt, allerdings komme ich mit den Attributen der Xmldaten nicht weiter.
    Hier mal ein Auszug der Datei

    XML-Quellcode

    1. <wind>
    2. <speed name="Gentle Breeze" value="4.1"/>
    3. <gusts/>
    4. <direction name="South" value="180" code="S"/>
    5. </wind>

    Und hier die zugehörige Klasse

    VB.NET-Quellcode

    1. Public Class wind
    2. Public Property speed As speed_
    3. Public Property gusts As gusts_
    4. Public Property direction As direction_
    5. Sub New()
    6. With Me
    7. If IsNothing(.speed) Then .speed = New speed_
    8. If IsNothing(.gusts) Then .gusts = New gusts_
    9. If IsNothing(.direction) Then .direction = New direction_
    10. End With
    11. End Sub
    12. Public Class speed_
    13. Public Property name As String = ""
    14. Public Property value As Double = 0.0
    15. Sub New()
    16. End Sub
    17. End Class
    18. Public Class gusts_
    19. Sub New()
    20. End Sub
    21. End Class
    22. Public Class direction_
    23. Public Property name As String = ""
    24. Public Property value As Double = 0.0
    25. Public Property code As String = ""
    26. Sub New()
    27. End Sub
    28. End Class
    29. End Class

    Geladen wird die Xml Datei mit ...

    VB.NET-Quellcode

    1. Dim MyObj as New wind
    2. LoadXmlfile(MyObj)

    VB.NET-Quellcode

    1. Public Shared Sub LoadXmlFile(ByRef MyObj as wind)
    2. Dim Data As New XmlSerializer(GetType(wind))
    3. Using Stream As New FileStream("C:\Tmp\TmpFile.xml", FileMode.Open)
    4. MyObj = CType(Data.Deserialize(Stream), wind)
    5. Stream.Close()
    6. End Using
    7. End Sub

    Mit LoadXmlFile() lade ich mir die Datei in MyObj.
    MyObj enthält aber keine Daten, nur die Standardwerte die die Klasseneigenschaften enthalten.
    Wenn ich eine andere Xml Datei in die selbe Klasse lade, funktioniert es.
    Beispiel;

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <wind xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <speed>
    4. <name>Gentle Breeze</name>
    5. <value>4.1</value>
    6. </speed>
    7. <gusts>
    8. </gusts>
    9. <direction>
    10. <name>South</name>
    11. <value>180</value>
    12. <code>S</code>
    13. </direction>
    14. </wind>


    Ich vermute, es liegt daran das die Xml Datei die Daten als Attribute und nicht als Werte enthält, oder liegt der Fehler woanders?
    Freundliche Grüße :)

    VB.NET-Quellcode

    1. <XmlAttribute("name")>
    2. Public Property name As String = ""


    Das wars, damit funktionierts.

    Die integrierten Funktionen von .net kenne ich, mehr oder weniger, auch die Möglichkeit die Xml Datei in eine Formatdatei mit Hilfe einer exe (Name fällt mir gerade nicht ein, gehört zum Visual Studio) umzuwandeln, woraus dann wieder eine VB Datei generiert werden kann.
    Diese Sachen funktionieren sicher sehr gut, allerdings wird mir der Code dabei einfach Zuviel und vieles verstehe ich da noch nicht so richtig. Gerade beim Thema Serialisierung von Xml fange ich die letzten Monate erst an und arbeite mich langsam rein.
    Hinzu kommt, dass ich Ewigkeiten auf VBA/VB gelernt habe, wodurch mir viel vom Objektorientierter Programmierung fehlte, wo ich mich in den letzten zwei Jahren reinarbeite.

    Daher erstelle ich mir Klassen zum Einlesen und Serialisieren lieber selber, um zu verstehen was wo passiert, als dass ich eine fertige Klasse bekomme und dort nicht verstehe was teilweise passiert. Ich hoffe ihr versteht mein "Problem" damit :)

    Vielen Dank auf jeden Fall!
    Kleine Vereinfachung deiner Wind-Klasse:

    VB.NET-Quellcode

    1. Public Class wind
    2. Public Property speed As speed_
    3. Public Property gusts As gusts_
    4. Public Property direction As direction_
    5. Sub New()
    6. With Me
    7. .speed = New speed_ ' Ist Quatsch, in Sub New auf Nothing zu testen - kann ja nichts anneres sein als Nothing (If IsNothing(.speed) Then .speed = New speed_)
    8. .gusts = New gusts_
    9. .direction = New direction_
    10. End With
    11. End Sub
    12. Public Class speed_
    13. Public Property name As String = ""
    14. Public Property value As Double = 0.0
    15. 'leerer Konstruktor unnötig
    16. End Class
    17. Public Class gusts_
    18. 'leerer Konstruktor unnötig
    19. End Class
    20. Public Class direction_
    21. Public Property name As String = ""
    22. Public Property value As Double = 0.0
    23. Public Property code As String = ""
    24. 'leerer Konstruktor unnötig
    25. End Class
    26. End Class