none
Lesen einer XML Datei in VB.NET mit unbekannter Anzahl von Elementen RRS feed

  • Frage

  • Hallo,

    ich habe eine Frage bezüglich Lesen von XML-Dateien in VB.NET. Ich möchte folgende XML-Datei auslesen:

    <?xml version="1.0"?>

    <Team>

    <Spieler1>

    <Name>Hans</Name>

    <Alter>23</Alter>

    </Spieler1>

    </Team>

    In einer ListBox sollen dann alle Spieler des Teams aufgelistet werden. Wenn man einen Spieler auswählt sollen seine Daten aus der XML in zwei Labels angezeigt werden.

    Bis dahin habe ich keine Probleme. Wenn man in der XML weiter Spieler hinzufügt, soll das Programm immer noch funktionieren.

    Ich habe keinen Plan wie das gehen soll, brauch also dringend Hilfe.

    Danke schon im voraus.

    Donnerstag, 9. August 2012 17:12

Antworten

  • Hallo,

    wenn die Anzahl der Spieler dein Problem ist, dann ist das eine einfache Sache!

    Du erstellst eine Klasse mit allen Paramtern die du zu einem Spieler haben willst und eine zweite Klasse in welcher du deine Spieler hinzufügst z.B. so

    Public Class Spieler
        
        Public Team As String
        Public SpielerName As String
        Public Geburtsdatum As Date
        Public SpielerNummer As Integer
       
    End Class
    
    <serializable()><Serializable()>Public Class Spielerliste
        Public Spieler As New List(Of Spieler)
    End Class
    

    Die zweite Klasse kannst du nun serialisieren und deserialisieren!

    Public Sub Speichern(ByVal meineSpieler As Spielerliste) Try Dim meinSerializer As New XmlSerializer(GetType(Spielerliste)) Dim meinFileSteam As New StreamWriter(My.Application.Info.DirectoryPath & "\Spieleriste.xml") meinSerializer.Serialize(meinFileSteam, Spielerliste) meinFileSteam.Flush() meinFileSteam.Close() Catch ex As Exception Windows.Forms.MessageBox.Show(ex.Message, "Fehler", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error) End Try End Sub

    Public Function Laden() As Spielerliste
            Dim meineSpielerliste As Spielerliste = Nothing
            Try
                Dim meineSpielerlisteXML As String = My.Application.Info.DirectoryPath & "\Spielerliste.xml"
                If File.Exists(meineSpielerlisteXML) = True Then
                    Dim meinSerializer As New XmlSerializer(GetType(Spielerliste))
                    Dim meinFileSteam As New StreamReader(meineSpielerlisteXML)
                    meineSpielerliste= meinSerializer.Deserialize(meinFileSteam)
                    meinFileSteam.Close()
                End If
            Catch ex As Exception
                Windows.Forms.MessageBox.Show(ex.Message, "Fehler", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            End Try
            Return meineKonfig
        End Function

    Ansonsten mal ein bisschen surfen und was zum serialisieren und deserialisieren suchen.

    Gruß
    David




    Donnerstag, 9. August 2012 21:34
  • Hi,

    Du kannst die List( Of <DeineKlasse> ) als DataSource für das Steuerelement verwenden, das hat dann genau den gewünschten Effekt.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 10. August 2012 15:55
    Moderator
  • Danke für die Information, nur leider kann ich damit nichts anfangen. Vielleicht kannst du mir ein Beispiel senden?

    Die Bestandteile für dein Beispiel stehen alle in diesem Thread. Die Klasse "Spieler", die LittleBlueBird gepostet hat, bildet einen Knoten "Spieler" in deiner XML Datei ab. Die einzige Änderung in deiner XML Struktur wäre, dass Du nicht <Spieler1>, <Spieler2>, ... schreibst, sondern für jeden Node nur "<Spieler>..." Daraus kannst Du dir dann eine List( Of Spieler ) erstellen und mit dem von David geposteten Code deserialisieren.

    Schau mal hier:

      http://www.aspnetzone.de/files/folders/stefanfalz/entry222489.aspx

    Da findest Du ein Beispiel für etwas sehr ähnliches.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 11. August 2012 09:51
    Moderator

Alle Antworten

  • Hallo,

    wenn die Anzahl der Spieler dein Problem ist, dann ist das eine einfache Sache!

    Du erstellst eine Klasse mit allen Paramtern die du zu einem Spieler haben willst und eine zweite Klasse in welcher du deine Spieler hinzufügst z.B. so

    Public Class Spieler
        
        Public Team As String
        Public SpielerName As String
        Public Geburtsdatum As Date
        Public SpielerNummer As Integer
       
    End Class
    
    <serializable()><Serializable()>Public Class Spielerliste
        Public Spieler As New List(Of Spieler)
    End Class
    

    Die zweite Klasse kannst du nun serialisieren und deserialisieren!

    Public Sub Speichern(ByVal meineSpieler As Spielerliste) Try Dim meinSerializer As New XmlSerializer(GetType(Spielerliste)) Dim meinFileSteam As New StreamWriter(My.Application.Info.DirectoryPath & "\Spieleriste.xml") meinSerializer.Serialize(meinFileSteam, Spielerliste) meinFileSteam.Flush() meinFileSteam.Close() Catch ex As Exception Windows.Forms.MessageBox.Show(ex.Message, "Fehler", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error) End Try End Sub

    Public Function Laden() As Spielerliste
            Dim meineSpielerliste As Spielerliste = Nothing
            Try
                Dim meineSpielerlisteXML As String = My.Application.Info.DirectoryPath & "\Spielerliste.xml"
                If File.Exists(meineSpielerlisteXML) = True Then
                    Dim meinSerializer As New XmlSerializer(GetType(Spielerliste))
                    Dim meinFileSteam As New StreamReader(meineSpielerlisteXML)
                    meineSpielerliste= meinSerializer.Deserialize(meinFileSteam)
                    meinFileSteam.Close()
                End If
            Catch ex As Exception
                Windows.Forms.MessageBox.Show(ex.Message, "Fehler", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            End Try
            Return meineKonfig
        End Function

    Ansonsten mal ein bisschen surfen und was zum serialisieren und deserialisieren suchen.

    Gruß
    David




    Donnerstag, 9. August 2012 21:34
  • Hallo David,

    deine Klassen passen nicht ganz zu seinem XML Schema. Die Spieler-Elemente befinden sich innerhalb des Team-Knotens. Die Klassen sollten eher so aussehen, wobei ich Eigenschaften den Feldern bevorzuge:

    Imports System.Collections.ObjectModel
    
    <System.Xml.Serialization.XmlRoot()> _
    Public Class Team
    
        Private m_Spieler As Collection(Of Spieler)
    
        Public Property Spieler() As Collection(Of Spieler)
            Get
                Return m_Spieler
            End Get
            Set(ByVal value As Collection(Of Spieler))
                m_Spieler = value
            End Set
        End Property
    
        Public Sub New()
            m_Spieler = New Collection(Of Spieler)
        End Sub
    
    End Class
    
    Public Class Spieler
    
        Private m_Name As String
        Private m_Geburtsdatum As Date
        Private m_Nummer As Integer
    
        Public Property Name() As String
            Get
                Return m_Name
            End Get
            Set(ByVal value As String)
                m_Name = value
            End Set
        End Property
    
        Public Property Geburtsdatum() As Date
            Get
                Return m_Geburtsdatum
            End Get
            Set(ByVal value As Date)
                m_Geburtsdatum = value
            End Set
        End Property
    
        Public Property Nummer() As Integer
            Get
                Return m_Nummer
            End Get
            Set(ByVal value As Integer)
                m_Nummer = value
            End Set
        End Property
    
    End Class
    

    Man sollte statt des Alters eher das Geburtsdatum speichern. Das Alter kann man daraus ja berechnen.

    Schönen Gruß,

    LittleBlueBird

    Donnerstag, 9. August 2012 22:08
  • Hallo kleiner blauer Vogel,

    es ging mir auch in erster Linie dadrum, ihm einen Ansatz zu zeigen. Wie seine Klasse später aussieht kann er ja selber bestimmen :-)

    - Schuhgröße
    - Trikot-Nr
    - Anzahl_geschossener_Tore
    - etc...

    Das ist ja das schöne an XML :-)

    Das Geburtsdatum habe ich ebenfalls aus dem besagten Grund genommen.

    Beste Grüße
    David

    Freitag, 10. August 2012 08:08
  • Danke für die Antworten!

    Anscheinend habe ich mein Problem nicht richtig beschrieben. Nur durch Veränderung der XML sollen weitere Spieler in die Listbox eingelesen werden. Wenn man in der XML also einen weiteren (vollständigen Spieler) hinzufügt und das Programm dann neu startet, soll der Spieler ohne Umwege sofort ebenfalls in der Listbox angezeigt werden.

    Gruß,

    Bolzen

    Freitag, 10. August 2012 15:23
  • Hi,

    Du kannst die List( Of <DeineKlasse> ) als DataSource für das Steuerelement verwenden, das hat dann genau den gewünschten Effekt.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 10. August 2012 15:55
    Moderator
  • Danke für die Information, nur leider kann ich damit nichts anfangen. Vielleicht kannst du mir ein Beispiel senden?

    Gruß, Bolzen

    Freitag, 10. August 2012 19:14
  • Hallo Bolzen,

    Schau Dir in den folgenden Threads den Mechanismus mit IEnumerable(Of XElement) an. Dort siehst Du auch die Zeile mit .DataSource = _charInfo.ToList() und das LINQ mit Select New Klasse() With _

    XML in XElement bearbeiten (es wird auch ein Neues XElement hinzugefügt)

    linq2xml abfrage

    Das geht so schön deshalb halte ich Stefans Beitrag als sehr hilfreich.

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 10. August 2012 19:29
    Moderator
  • Danke für die Information, nur leider kann ich damit nichts anfangen. Vielleicht kannst du mir ein Beispiel senden?

    Die Bestandteile für dein Beispiel stehen alle in diesem Thread. Die Klasse "Spieler", die LittleBlueBird gepostet hat, bildet einen Knoten "Spieler" in deiner XML Datei ab. Die einzige Änderung in deiner XML Struktur wäre, dass Du nicht <Spieler1>, <Spieler2>, ... schreibst, sondern für jeden Node nur "<Spieler>..." Daraus kannst Du dir dann eine List( Of Spieler ) erstellen und mit dem von David geposteten Code deserialisieren.

    Schau mal hier:

      http://www.aspnetzone.de/files/folders/stefanfalz/entry222489.aspx

    Da findest Du ein Beispiel für etwas sehr ähnliches.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 11. August 2012 09:51
    Moderator
  • Hallo Bolzen,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 24. August 2012 11:11
    Moderator