[.NET] xml in Array einlesen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Estorado, 20. Dezember 2010 .

Schlagworte:
  1. 20. Dezember 2010
    xml in Array einlesen

    Hallo,

    ich bräuchte kurz eure Hilfe:

    Mache eine Mitgliederverwaltung mit einer XML Datei. Diese Mitglieder schreibe ich dann in eine Word-Vorlage (dotx).

    Das habe ich schon hingebracht, jetzt fehlt mir der entscheidende Knackpunkt:

    Habe eine xml Datei (C:\logs\test.xml) mit folgendem Inhalt:
    Spoiler
    Code:
    <?xml version="1.0" standalone="yes"?>
    <Mitglieder>
     <Mitglied>
     <Nachname>Testnachname1</Nachname>
     <Vorname>Testvornam1</Vorname>
     <Geschlecht>Männlich</Geschlecht>
     </Mitglied>
     <Mitglied>
     <Nachname>Testnachname2</Nachname>
     <Vorname>Testvorname2</Vorname>
     <Geschlecht>Weiblich</Geschlecht>
     </Mitglied>
     <Mitglied>
     <Nachname>Testnachname3</Nachname>
     <Vorname>Testvorname3</Vorname>
     <Geschlecht>Männlich</Geschlecht>
     </Mitglied>
    </Mitglieder>

    Ich habe nun folgenden Code:
    Spoiler
    Code:
    Dim i As Integer
     Dim XMLDatei As XDocument = XDocument.Load("C:\logs\test.xml")
     Dim mitglied As String
     Dim Mitglieder As New Dictionary(Of Integer, String)
     Mitglieder.Add(1, "Item1")
     Mitglieder.Add(2, "Item2")
    
     For i = 1 To 39 Step 1
     mitglied = "Tm_Mitglied" & i
     If WordAppl.ActiveDocument.Bookmarks.Exists(mitglied) Then
     WordAppl.ActiveDocument.Bookmarks(mitglied).Range.Text = Mitglieder(i)
     End If
     Next i

    Mein Denkansatz ist wie folgt:
    Der Array "Mitglieder" muss jetzt so lange mit Mitglied.Vorname & Mitglied.Nachname aufgefüllt werden, bis die Datei zu Ende ist. Die Schleife geht deshalb bis 40, weil ich insgesamt 40 Textmarken in meiner Word-Vorlage verwenden kann.

    Konkret habe ich es mir so vorgestellt:

    Mitglieder.Add(1, "Testnachname1 Testvornam1")
    Mitglieder.Add(2, "Testnachname2 Testvornam2")

    Das ich eine Schleife benötige ist mir klar. Was mir nicht klar ist, wie lese ich die XML so wie oben gewünscht aus?

    Könntet Ihr mir auf die Sprünge helfen? Dann hätte ich nämlich das Programm funktionierend und muss "nur noch" das MakeUp machen.

    Bin ein Anfänger und arbeite mit Visual Studio Express 2010.

    Bewertung ist natürlich drin.

    Grüße
     
  2. 20. Dezember 2010
    AW: xml in Array einlesen

    Hallo Estorado,

    anstatt mit XmlDocument zu arbeiten, würde ich an Deiner Stelle mit einem DataSet arbeiten.
    Code:
    DataSet.ReadXml
    ist dann das Stichwort. Im DataSet befinden sich eine oder mehrere Tabellen.
    In Deiner Beispieldatei sehe ich eine Tabelle (Mitglied).

    Willst Du nun den Nachnamen des zweiten Datensatzes auslesen, würde ich das so machen:
    Code:
    Dim dateiPfad As String = "C:\Test\mitglieder.xml"
    
    Dim ds As DataSet
    Dim mitglieder As DataTable
    Dim mitglied As DataRow
    Dim nachname As String
    
    ds = DataSet.ReadXml(dateiPfad) 
    mitglieder = ds.Tables("Mitglied")
    
    mitglied = mitgliederTabelle.Rows(1)
    nachmame = mitglied("Nachname")
    Achtung: Der Code ist nicht getestet !

    Hoffe das hilft.

    BG MaxDev
     
  3. 21. Dezember 2010
    AW: xml in Array einlesen

    finde die lösung n bissl haarsträubig @MaxDev, einfacher würde ich es so emfpinden:

    Code:
    ds.Tables("Mitglied").Rows(1)("Nachname")
    bzw.
    ds.Tables(0).Rows(1)("Nachname")
    
    du kannst anstatt "Nachname" in den Klammern auch einfach deinen Index eingeben also: 0,1,2
    0= Nachname
    1= Vorname
    2= Geschlecht

    falls du dir nun einfach alle Werte auslesen lassen möchtest und adden willst (wohin auch immer), von deiner XML datei dann hier mal ohne Fehlerhandling:

    Code:
    for i as Integer = 0 to ds.Tables("Mitglied").rows.count -1 step +1
     Zuweisung = ds.Tables(0).Rows(i)("Nachname")
     Zuweisung = ds.Tables(0).Rows(i)("Vorname")
     Zuweisung = ds.Tables(0).Rows(i)("Geschlecht")
    next
    
    mfg whenyou
     
  4. 21. Dezember 2010
    AW: xml in Array einlesen

    Danke für die beiden tollen Hinweise! Hat mir sehr geholfen. Habe es nun so hingebracht:

    Ich lese direkt das DataSet Mitglieder, nicht die xml Datei, diese muss vorher ins DataSet geladen werden. So finde ich es viel leichter. Wenn noch wer Verbesserungen hat kann mir ja per PM schreiben. Soweit ist dann dicht hier. BWs sind draußen.

    Code:
     Dim arMitglieder As New Dictionary(Of Integer, String)
     Dim dsMitglieder As DataSet
     Dim varmitglied As String
     Dim varNachname As String
     Dim varVorname As String
     Dim varNachundVorname As String
    
     dsMitglieder = Mitglieder
    
     'Dim i As Integer
    
    
     For i As Integer = 0 To dsMitglieder.Tables("Mitglied").Rows.Count - 1 'Step +1
     varmitglied = "Tm_Mitglied" & i
    
     varNachname = dsMitglieder.Tables(0).Rows(i)("Nachname")
     varVorname = dsMitglieder.Tables(0).Rows(i)("Vorname")
     varNachundVorname = varNachname & varVorname
    
     arMitglieder.Add(i, varNachundVorname)
    
     If WordAppl.ActiveDocument.Bookmarks.Exists(varmitglied) Then
     WordAppl.ActiveDocument.Bookmarks(varmitglied).Range.Text = arMitglieder(i)
     End If
     Next i
    --- Post vom 30.12.2010

    Entschuldigt, dass ich das Thema nochmal aufreiße und auch gleich noch einen Doppelpost drauflege, habe aber nochmal eine Frage:

    Kann man auf das Dataset auch eine Art Filter legen, dass nur die Mitglieder kommen, die das Geschlecht männlich haben?

    Hier nochmal mein Code, das Dataset heißt "Mitglieder" und die Tabelle "Mitglied". Da gibts 3 Spalten: Nachname, Vorname, Geschlecht. Nach und Vorname sollen ausgegeben werden, jedoch nur die, die Geschlecht männlich haben.

    Code:
    For i As Integer = 0 To dsMitglieder.Tables("Mitglied").Rows.Count - 1 'Step +1
     varmitglied = "TM_Mitglied" & i
     varNachundVorname = dsMitglieder.Tables(0).Rows(i)("Nachname") & " " & dsMitglieder.Tables(0).Rows(i)("Vorname")
    
     arMitglieder.Add(i, varNachundVorname)
    
     If WordAppl.ActiveDocument.Bookmarks.Exists(varmitglied) Then
     WordAppl.ActiveDocument.Bookmarks(varmitglied).Range.Text = arMitglieder(i)
     End If
     Next i
     
  5. 30. Dezember 2010
    AW: xml in Array einlesen

    geht definitiv, kann aber kein vb ^^

    sind einfach nur select-statements die man da formuliert und an die db sendet.. "SELECT * FROM mitglieder WHERE mitglied.geschlecht = männlich" oder so ähnlich, weiß nicht wie deine db/dataset im einzelnen aussieht und die sql-syntax am besten nochmal genau nachgucken oder erklären lassen ^^ möglich ist es auf jeden fall.

    Galileo Computing :: Einstieg in Visual Basic 2010
     
  6. 30. Dezember 2010
    AW: xml in Array einlesen

    Hallo Estorado,

    die Funktion Select sollte Dir helfen, die ist an der DataTable. Die nimmt einen Ausdruck (Expression) entgegen, mit dem in der Tabelle gefiltert werden kann.

    DataTable.Select-Methode (String) (System.Data)

    Die Expressions unterstützen die gängigen Operatoren aus SQL (=, LIKE, >, <, <>, usw).

    DataColumn.Expression Property (System.Data)

    Code:
    deinDataSet.Tables("Mitglied").Select("Geschlecht = 'männlich'")
    Du bekommst dann ein Array mit den Rows zurück, an dem die Bedingung stimmt.

    Viel erfolg
    BG MaxDev
     
  7. 21. Januar 2011
    AW: xml in Array einlesen

    Hallo MaxDev,

    vielen Dank für die Antwort. Was ich nicht verstehe:
    Ich bekomme durch das verwenden der Select Funktion eine eindimensionalen Array zurück. Irgendwie kann ich aber diesen Array nicht weiterverwenden. Ich weiß nicht genau wo ich das select platzieren muss oder wie ich es einbauen/umbauen muss:

    Code:
    'Variablen deklarieren
    Dim arMitglieder As New Dictionary(Of Integer, String)
    Dim dsMitglieder As DataSet
    Dim varNachundVorname As String
    
    'DateSet zuweisen
    dsMitglieder = Mitglieder
    
    'Schleife, aus DataSet auslesen
    For i As Integer = 0 To dsMitglieder.Tables("Mitglied").Rows.Count - 1
    
    'Funktioniert nicht
    varNachundVorname = dsMitglieder.Tables(0).Select("männlich").Rows(i)("Nachname") & " " & dsMitglieder.Tables(0).Select("männlich").Rows(i)("Vorname")
    
    'Bringt alle
    varNachundVorname = dsMitglieder.Tables(0).Rows(i)("Nachname") & " " & dsMitglieder.Tables(0).Rows(i)("Vorname")
    
    'Dict füllen
    arMitglieder.Add(i, varNachundVorname)
    Habe lange darüber nachgedacht, aber mir fällt nichts ein wie ich das anders lösen könnte? Eventuell hat noch jemand einen Tipp.

    Grüße

    Estorado

    P.S. Schade dass das Board kein vb.net Syntax kann...
     
  8. 21. Januar 2011
    AW: xml in Array einlesen

    Hallo Estorado,

    Du machst erst das Select auf die Tabelle. Dabei gibst Du einen Spaltennamen aus der Tabelle und den gewünschten Wert in der Tabelle an. Zum Beispiel:

    Code:
    deinDataSet.Tables("Mitglied").Select("Geschlecht = 'männlich'")
    In einem Code, der Deinem ähnlich ist, könnte das so aussehen:
    Code:
    Const DATEINAME As String = "C:\_Test\meinDataSet.xml"
    
    ' Variablen deklarieren
    Dim dsMitglieder As DataSet
    Dim vorname As String
    Dim nachname As String
    Dim geschlecht As String
    
    ' DataSet einlesen
    dsMitglieder = New DataSet
    dsMitglieder.ReadXml(DATEINAME)
    
    ' Zeilen auslesen, die Du haben willst
    Dim rowsMaenner As DataRow()
    rowsMaenner = dsMitglieder.Tables("Mitglied").Select("Geschlecht = 'männlich'")
    
    ' Jede Zeile einzeln "bearbeiten"
    ' Hier erhälst Du alle Zeilen, bei denen "Geschlecht = 'männlich'" zutrift
    For Each rowMann As DataRow In rowsMaenner
    
     ' Vorname auslesen
     vorname = rowMann("Vorname")
    
     ' Nachname auslesen
     nachname = rowMann("Nachname")
    
     ' Geschlecht auslesen
     ' (macht wenig Sinn, da aufgrund der Select-Bedingung immer 'männlich' ausgelesen wird
     geschlecht = rowMann("Geschlecht")
    
    Next
    In dem Beispiel ist "Geschlecht" der Name einer Spalte in der DataTable. "männlich" ist der Wert, den die Spalte enthalten muss, damit die Zeile (im Array von DataRows) zurückgegeben wird.

    Hoffe das hilft.

    BG MaxDev
     
  9. 21. Januar 2011
    AW: xml in Array einlesen

    Hallo MaxDev,

    Knoten geplatzt! Vielen Dank, es funktioniert. Muss jetzt über deinen Code wahrscheinlich noch eine Nacht schlafen, dann hab ich dein vorgehen gecheckt :]

    Viele Grüße und Danke für die Hilfe. BW kommt sobald ich wieder andere bewertet habe.
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.