Hallo,

da die neue Version meiner App jetzt endlich im Store ist kann ich ein bisschen was darüber schreiben, wie ich das Laden von XML Dateien Realisiert habe.
Sollte jemand eine Idee haben wie es einfacher geht, oder einen Fehler entdecken, kann er sich gerne bei mir melden.

Noch zur Info: der Code ist für Windows Phone 7.1 und in C#.

Als erstes die Funktion welche die XML Datei laden, parsen und den Inhalt einer ListBox zur Verfügung stellen soll: 
 

public void ladeXML(string xmlUrl, ListBox ausgabe)
 
//Beim Aufrufen wird die URL der XML Datei und die ListBox in der der Inhalt ausgegeben werden soll übergeben.
 
        {
     
            WebClient client = new WebClient();
 
            client.OpenReadAsync(new Uri(xmlUrl, UriKind.Absolute));
 
//Es wird ein neues Webclient Element erstellt und damit der Inhalt der XML Datei als Stream gelesen.
 
            client.OpenReadCompleted += (sender, e) =>
            {
                if (e.Error != null)
                {
                        MessageBox.Show("Keine Verbindung zum Server!");
                        return;
                     
                }
 
                XElement xdoc = XElement.Load(e.Result);
 
//der Stream kann mit XElement.Load(e.Result) in ein XElement geladen werden.
 
                 
//Ab hier ist der Code abhängig vom Inhalt der XML Datei.
//Mann muss eine neue Klasse erstellen, welche die zu speichernden Elemente enthält (Beispiel siehe weiter unten)
//Bei der XML Datei handelt es sich hier um ein RSS Feed
 
                List<rss> TS = new List<rss>();
//Ich erstelle also eine Liste von rss.cs (die Klasse die ich für mein RSS-Feed-Item erstellt habe)
 
                foreach (XElement eachmb in xdoc.Element("channel").Elements("item"))
//jetzt durchlaufe ich mit einer foreach Schleife alle item Einträge innerhalb des Tags channel, der die gesamte Datei umschließt.                  
{
                    var text = eachmb.Element("description");
                    var title = eachmb.Element("title");
                    var date= eachmb.Element("pubDate");
                    var link = eachmb.Element("link");
 
                    if (title != null && text != null && date != null && link != null)
//Jeder Wert den ich auslesen will wird einer Variablen zugewiesen und auf null überprüft.
                        TS.Add(new rss() { title = title.Value, pubDate = date.Value, link = link.Value, description = text.Value});
 
// jetzt kann ein neuer Eintrag in der Liste mit den aus der XML Datei erhaltenen Daten erzeugt werden.
                }
 
                ausgabe.DataContext = TS;
//Die fertige Liste wird dann dem DataContext der Listbox zugewiesen.
                
 e.Result.Close();
 
            };
 
// nur noch den Stream schließen und fertig.

 
Wichtig ist noch:
Der WebClient speichert seine Anfrage an den Server, und lädt beim erneuten Aufruf derselben Url den Inhalt nicht neu herunter (Cache), deshalb muss die Url verändert werden z.B. durch eine Zufallszahl: 
 
 
 

Random rand = new Random();
xmlUrl = xmlUrl + "?random=" + rand.Next();

 
Das ist zwar nicht schön aber die einzige Möglichkeit die ich bis jetzt gefunden habe neu zu laden ohne die App neu starten zu müssen.


Hier noch der Code zur rss.cs: 
 

public class rss
 {
      public string title { get; set; }
      public string link { get; set; }
      public string description { get; set; } 
      public string pubDate { get; set;}
 
}

 
Die Anzeige der Daten in der ListBox funktioniert mit Hilfe von Binding:

Mit <ListBox.ItemTemplate><DataTemplate> kann eine Vorlage zur Datenanzeige erstellt werden.

Hier mein Beispielcode: 

<ListBox x:Name="listBox" ItemsSource="{Binding}"code>set;}
 
}

 
Die Anzeige der Daten in der ListBox funktioniert mit Hilfe von Binding:

Mit <ListBox.ItemTemplate><DataTemplate> kann eine Vorlage zur Datenanzeige erstellt werden.

Hier mein Beispielcode: 

<ListBox x:NameMargin="0,0,0,6" SelectionChanged="listBox_SelectionChanged" HorizontalAlignment="Left" >
    <ListBox.ItemTemplate>
        <DataTemplate>
 
            <StackPanel Orientation="Vertical">
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding pubDate}" FontSize="15" HorizontalAlignment="Left" TextWrapping="Wrap" />
                    <TextBlock Text="{Binding title}" FontSize="25"  Width="450" FontWeight="Bold" HorizontalAlignment="Left" TextWrapping="Wrap" />
                    <TextBlock Text="{Binding description}" FontSize="18" Width="450" HorizontalAlignment="Left" TextWrapping="Wrap" />
                </StackPanel>
                <Rectangle Width="450" Height="2" Fill="White" />
            </StackPanel>
 
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox >

 

Zum Schluss noch eine Beispiel einer XML Dateir:#006699;font-weight:bold;">StackPanel>