XML File einlesen und nach Elementen Filtern

theone101

Mitglied
Hallo,

also ich versuche gerade über VB2005 mit dem XElement wine XML Datei einzulesen und bestimmte Elemente auszugeben.

Hier die Xml File:
Code:
<XmlToTs>
    <Eit>
        <Sender>Pro7</Sender>
        <StartTime>2008-06-05 14:23:00</StatTime>
        <Duration>01:00:00</Duration>
    </Eit>
    
    <Eit>
        <Sender>Sat1</Sender>
        <StartTime>2008-06-05 16:44:00</StatTime>
        <Duration>02:30:00</Duration>
   </Eit>
</XmlToTs>

Ich möchte nun alle Sender und StartTime haben die in deiser XML exsistieren.
Leider kann ich mit diesem Code nur immer die gleiche Eit auslesen, bekomme also immer wieder den selben Sender und Start Time:

Code:
Dim booksFromFile As XElement = XElement.Load("C:\muc.xml")

ListBox1.Items.Add(booksFromFile.Element("Eit").Element("Event").Element("StartTime"))
ListBox1.Items.Add(booksFromFile.Element("Eit").Element("Event").Element("StartTime"))

Hoffe jemand kann mir da helfen.

Grüße

Thomas
 
Zuletzt bearbeitet:
Hallo Norbert,

Danke für deine Antwort aber das ist doch nicht VB.

Ich hab versucht des abzuleiten aber irgend wie geht des nicht so richtig.

Haste mir da nix für VB.

Gruß

Thomas
 
Hier hab ichs mit VB.Net... soviel Unterschied ist da nicht:

Code:
Module Module1

    ' Einer der Vorteile gegenüber C# :P
    Dim booksFromFile As XElement = _
    <XmlToTs>
        <Eit>
            <Sender>Pro7</Sender>
            <StartTime>2008-06-05 14:23:00</StartTime>
            <Duration>01:00:00</Duration>
        </Eit>

        <Eit>
            <Sender>Sat1</Sender>
            <StartTime>2008-06-05 16:44:00</StartTime>
            <Duration>02:30:00</Duration>
        </Eit>
    </XmlToTs>

    Sub Main()
        Console.WriteLine("In der Datei vorkommende Sender:")

        For Each se In From s In booksFromFile.<Eit> Select s.<Sender>.Value
            Console.WriteLine(se)
        Next

        Console.ReadKey()
    End Sub
End Module

Ausgabe:
In der Datei vorkommende Sender :
Pro7
Sat1
 
Zuletzt bearbeitet:
Hallo,
Dake habs jetzt geschaft.

Hab aber noch eine kleine Frage und zwar, ich möchte noch auf die StartTime und die Duration zugreifen.

So das ich am Ende das Ergebnis hab:
Code:
Pro7
2008-06-05 14:23:00
01:00:00

Sat1
2008-06-05 16:44:00
02:30:00

Wie kann ich das am besten Lösen?

Gruß

Thomas
 
Du müsstest einfach die Abfrage anpassen. Das Sample von Norbert (http://blog.norberteder.com/index.php?entry=entry070930-193152) zeigt dir sehr schön wie du mit LINQ ein eigenes Objekt erstellst auf das du dann zugreifen kannst:

Code:
For Each se In From s In booksFromFile.<Eit> Select new{Sender = (String) s.<Sender>.Value, Start = (String) s.<StartTime>.Value,Duration = (String) s.<Duration>.Value}
  Console.WriteLine(se.Sender)
  Console.WriteLine(se.Start)
  Console.WriteLine(se.Duration)
Next

So, oder so ähnlich (Bitte nicht schlagen wenns nicht passt, ich hab nicht wirklich Ahnung von VB, bin C#ler), hab es gerade mal auf die schnelle so hingetippt wie ich denke das es stimmen könnte.

Notfalls einfach nochmal den Blog-Eintrag angucken und auf VB umbasteln
 
Knapp vorbei:

Code:
        For Each se In From s In booksFromFile.<Eit> Select New With {.Sender = s.<Sender>.Value, .Start = s.<StartTime>.Value, .Duration = s.<Duration>.Value}
            Console.WriteLine(se.Sender)
            Console.WriteLine(se.Start)
            Console.WriteLine(se.Duration)
        Next

Wenn die Namen die gleichen bleiben sollen, dann reichts sogar so:

Code:
        For Each se In From s In booksFromFile.<Eit> Select s.<Sender>.Value, s.<StartTime>.Value, s.<Duration>.Value
            Console.WriteLine(se.Sender)
            Console.WriteLine(se.StartTime)
            Console.WriteLine(se.Duration)
        Next
 
Zuletzt bearbeitet:
...aber nah dran - Sorry!

Eintrag für mich: Mehr mit LINQ und VB beschäftigen!

Danke für die Verbesserung
 
Zurück