C# XML Datei in Windows Phone 7 untersuchen

XHotSniperX

Lt. Junior Grade
Registriert
Jan. 2008
Beiträge
472
Hallo

Mein Problem ist ganz einfach aber ich weiss nicht, wie ich das mit C# mache. Im Internet habe ich bereits einiges gesehn, da wird jedoch immer eine XML lokal geladen.

Ich möchte ein Programm schreiben, das eine XML Datei aus dem Internet lädt und diese untersucht. In der XML stehen Informationen über den Zustand verschiedener Server.

Etwa so:
HTML:
<status>
  <server name="Server1" online="True"/>
  <server name="Server2" online="False"/>
  ...
</status>

Jetzt möchte ich also prüfen, ob ein Server Online oder Offline ist und diesen Zustand ganz einfach mit einem Lämpchen anzeigen (grün oder rot).

Nochmal Zusammengefasst:

Wie lade ich die XML aus dem Internet damit ich sie überprüfen kann?
Wie kann ich z.B. den Status des Server2 auf False oder True prüfen?

Ausserdem kann man glaub ich bei Windows Phone 7 nicht XmlDocument als Typ benutzen sondern XDocument!

Das wärs schon :) Danke
 
Habe mal etwas ähnliches für RSS Feeds gemacht. Sollte selbsterklärend sein. Zugriff kannst du dann mit Linq machen.

Code:
public void LoadXmlItems(string xmlUrl)
{
   WebClient client = new WebClient();

   client.OpenReadCompleted += (sender, e) =>
   {
        if (e.Error != null)
            return;

        Stream str = e.Result;
        XDocument xdoc = XDocument.Load(str);

        // take 10 first results
        List<RssFeedItem> rssFeedItems = (from item in xdoc.Descendants("item")
                                            select new XmlItem()
                                            {
                                                Title = item.Element("title").Value,
                                                Description = item.Element("description").Value,
                                                Url = new Uri(item.Element("link").Value, UriKind.Absolute)
                                            }).ToList();
        // close
        str.Close();

        // add results to the list
        XmlItems.Clear();
        foreach (RssFeedItem item in rssFeedItems)
        {
           XmlItems.Add(item);
        }
    };
    client.OpenReadAsync(new Uri(xmlUrl, UriKind.Absolute));
}
 
ich verstehe das noch nicht. muss ich das mit "take 10 first results" auch machen?
Wo genau wird die XML heruntergeladen?

du fügst quasi die values in der xml einem von dir definierten XmlItem zu?
 
Zuletzt bearbeitet:
XHotSniperX schrieb:
ich verstehe das noch nicht. muss ich das mit "take 10 first results" auch machen?

Das ist der Zugriff über Linq, den musst du natürlich an deine einfache Struktur anpassen, sollte kein Problem sein.

XHotSniperX schrieb:
Wo genau wird die XML heruntergeladen?

Das wird nirgends persistiert, sondern steht dir dort im Code flüchtig zur Verfügung.
edit: achso, du meintest das anders. Du übergibst der Methode die Adresse der XML, der WebClient besorgt sie dann.

XHotSniperX schrieb:
du fügst quasi die values in der xml einem von dir definierten XmlItem zu?

Ganz genau, das ist eine eigene Klasse und brauchst du natürlich nicht.
 
Zuletzt bearbeitet:
Könnte ich jetzt z.B. so durch die XML iterieren bis ich den Server "Server2" gefunden habe und die Operation durchführ:

Code:
foreach (var a in xdoc.Elements())
                {
                    if (a.Element("name").Value.Equals("Server2"))
                    {

                        if (a.Element("online").Value.Equals("True"))
                            ellipse1.Fill = new SolidColorBrush(Colors.Green);
                        else
                            ellipse1.Fill = new SolidColorBrush(Colors.Red);
                    }
                }

Irgendwie gibts dann eine Null Reference Ausnahme bei der 3. Zeile :mad:
Ergänzung ()

hey hab gerade in einem c# buch gelesen, dass die inneren values eines XML Elements Attribute heissen..



Code:
  foreach (var a in xdoc.Elements("status"))
                {
                    if (a.Attribute("name").Value.Equals("Server2"))
                    {

                        if (a.Attribute("online").Value.Equals("True"))
                            ellipse1.Fill = new SolidColorBrush(Colors.Blue);
                        else
                            ellipse1.Fill = new SolidColorBrush(Colors.Red);
                    }
                }

aber so gibts auch die gleiche Ausnahme :(
Ergänzung ()

Juhuiiiii sooo hat es geklappt:

Code:
        public void LoadXmlItems()
        {
            WebClient client = new WebClient();
            String xmlURL = "http://blablablabla/status.xml";
            client.OpenReadCompleted += (sender, e) =>
            {
                if (e.Error != null)
                    return;

                Stream str = e.Result;
                XElement xdoc = XElement.Load(str);

                // take results from xml

                foreach (var a in xdoc.Elements("server"))
                {
                  
                    if (a.Attribute("name").Value.Equals("Server2"))
                    {

                        if (a.Attribute("online").Value.Equals("True"))
                            ellipse1.Fill = new SolidColorBrush(Colors.Blue);
                        else
                            ellipse1.Fill = new SolidColorBrush(Colors.Red);
                    }
                }


                // close
                str.Close();

            };
            client.OpenReadAsync(new Uri(xmlURL, UriKind.Absolute));
        }

Dankeee
 
Zuletzt bearbeitet:
Zurück
Oben