XML-Dateien sind ja sehr praktisch um kleinere Datenmengen dynamisch irgendwoher zu laden. In Folgendem Besipielcode sind die notwendigen Funktionen zusammengefasst mit denen an das recht einfach unter Silverlight tun kann. Im Beispiel liegt die XML-Datei dort, wo auch die XAP-Datei liegt.
Damit sowas problemlos passiert, muss ein Zugriff auf den Webserver möglich sein. Neben den reinen Zugriffsrechten sollte auch eine Cross-Domain-Policydatei vorhanden sein:
Dateiname im Rootverzeichnis des Servers: crossdomain.xml mit folgendem Inhalt:
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
Die XML-Datei sieht so aus:
<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<filmliste>
<Film title="Testfilm1" filename="Film1.wmv" comment="kein Kommentar"/>
</filmliste>
Die Lade- und Auslesefunktion sehen bei mir so aus:
void getFilmListFromHomepage()
{
try
{
Uri xmlFilmListFile = new Uri(this.SourceDirectory +
"FilmListe.xml", UriKind.Absolute);
WebClient cl = new WebClient();
cl.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler(cl_DownloadStringCompleted);
cl.DownloadStringAsync(xmlFilmListFile);
return;
}
catch (Exception xx)
{
MessageBox.Show("Problem beim lesen der FilmListe: " +
xx.Message.ToString());
return;
}
}
void cl_DownloadStringCompleted(object sender,
DownloadStringCompletedEventArgs e)
{
// achtung crossdomain policy datei muss da sein!
string xmlFilmListe = e.Result;
XDocument xdoc = XDocument.Parse(xmlFilmListe);
_FilmListe = from ex in xdoc.Descendants("Film")
select new Film
{
Title = ex.Attribute(XName.Get("title")).Value,
FileName = ex.Attribute(XName.Get("filename")).Value,
Comment = ex.Attribute(XName.Get("comment")).Value
};
PLBFilmTitles.ItemsSource = _FilmListe;
}
Übrigens an das Startverzeichnis der Silverlightanwendung
kommt man so heran:
public void GetConfigInfosFromServer()
{
string cp =
System.IO.Path.GetDirectoryName(Application.Current.Host.Source.ToString())
+ @"\MovieViewer.xml";
cp = cp.Replace("\\", "//");
try
{
Uri xmlFilmListFile = new Uri(cp, UriKind.Absolute);
WebClient cl = new WebClient();
cl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(
cl_DownloadConfigInfosCompleted);
cl.DownloadStringAsync(xmlFilmListFile);
return;
}
catch (Exception xx)
{
MessageBox.Show("Problem beim lesen der Konfiguration: " +
xx.Message.ToString());
return;
}
}
Vielleicht hilft der Quellcode ja doch dem Einen oder Anderen schneller
zum Ziel zu kommen.