Hulp nodig bij het parseren van XML-feed in Windows Phone

I have an xml feed that I've retrieved via httpwebrequest, and I'm having problems parsing the feed since its unlike the times I've tried this in the past. So far I have the url http://webservices.nextbus.com/service/publicXMLFeed?command=routeConfig&a=sf-muni&r=N

waarin ik heb opgeslagen

 XDocument doc = XDocument.Parse(feedString);

En ik weet dat wanneer ik dat allemaal in een listbox heb gedumpt voor foutopsporingsdoelen, ik er alles krijg, ik heb alleen problemen met het parseren van de feed:

<body copyright="All data copyright San Francisco Muni 2012.">






En zo verder, enzovoort

Ik wil elk attribuut in elke stop-tag opslaan in een array, maar ik ben volledig gestoord over hoe ik zelfs zou beginnen.

Bedankt

Bijwerken: Ik denk dat ik het heb laten werken aan die eerste msdn-link, maar dit krijgt alleen de eerste regel:

 using (XmlReader reader = XmlReader.Create(new StringReader(feed)))
        {
            reader.ReadToFollowing("stop");
            reader.MoveToFirstAttribute();
            string tag = reader.Value;


            reader.MoveToNextAttribute();
            string title = reader.Value;

            reader.MoveToNextAttribute();
            string lat = reader.Value;

            reader.MoveToNextAttribute();
            string lon = reader.Value;


        }

Hoe zou ik elke stop doorlopen met die code hierboven?

Bedankt

EDIT: # 2

Deze lus werkt, maar blijft de eerste rij stopkenmerken weergeven:

using (XmlReader reader = XmlReader.Create(new StringReader(feed)))
           {
               reader.ReadToFollowing("stop");
               while (reader.MoveToNextAttribute())
               {

              //Move the reader back to the element node.



                   //reader.ReadToFollowing("stop");
                   reader.MoveToFirstAttribute();
                   string tag = reader.Value;
                   MessageBox.Show(tag);

                   reader.MoveToNextAttribute();
                   string title = reader.Value;
                   MessageBox.Show(title);
                   reader.MoveToNextAttribute();
                   string lat = reader.Value;
                   MessageBox.Show(lat);
                   reader.MoveToNextAttribute();
                   string lon = reader.Value;
                   MessageBox.Show(lon);


               }
               reader.MoveToElement();
           }

Ik heb het gevoel dat ik er zo dichtbij kom om het uit te zoeken.

0
toegevoegd de auteur Anirudh Ramanathan, de bron
Een opmerking voor toekomstige googlers die op zoek zijn naar NextBus in C #: ik heb een .NET-client voor de NextBus API gemaakt op github. com/jayhill/NextBus.NET .
toegevoegd de auteur Jay, de bron

3 antwoord

Hier is een complete oplossing met de hulp van Linq. Zie gewoon wat result bevat

using (WebClient w = new WebClient())
{
    string xml = w.DownloadString("http://webservices.nextbus.com/service/publicXMLFeed?command=routeConfig&a=sf-muni&r=N");
    XDocument xDoc = XDocument.Parse(xml);
    var result = xDoc.Descendants("stop")
                    .Select(n => new
                    {
                        Tag = (string)n.Attribute("tag"),
                        Title = (string)n.Attribute("title"),
                        Lat = (string)n.Attribute("lat"),
                        Lon = (string)n.Attribute("lon"),
                        StopId = (string)n.Attribute("stopId")
                    })
                    .ToArray();
}
1
toegevoegd

Hier is iets dat je kunt gebruiken:

XmlReader xmlReader = XmlReader.Create("http://webservices.nextbus.com/service/publicXMLFeed?   command=routeConfig&a=sf-muni&r=N");
List aTitle= new List();

// Add as many as attributes you have in your "stop" element

while (xmlReader.Read())
{
 //keep reading until we see your element
 if (xmlReader.Name.Equals("stop") && (xmlReader.NodeType == XmlNodeType.Element))
 {
   string title = xmlReader.GetAttribute("title");
   aTitle.Add(title);

  //Add code for all other attribute you would want to store in list.
  }
}

Bel uiteindelijk de lijst en op basis van de index kun je alle items krijgen.

0
toegevoegd

Er zijn veel manieren om XML-bestanden te ontleden. Hier is een eenvoudige benadering:

        XDocument doc = XDocument.Load(feedString);
        var stops = doc.Document.Descendants(XName.Get("route"));
       //Loop over all stops in the XML
        foreach (var stop in stops)
        {

        }

Ik weet niet zeker wat ik bedoel met 'elk attribuut in elke stoptag in een array opslaan', maar ik zou een type definiëren:

class RouteStop
{  //make setters private and init them in ctor to make it immutable
    public string Tag {get; set;} //maybe int ?
    public string Title {get; set;}
    public double Latitude {get; set;}
    public double Longitude {get; set;}
    public int ID {get; set;}
}

Definieer vervolgens een lijst met RouteStop

List routeStops = new List();

en simpelweg in het create-object in foreach-lus

foreach (var stop in stops)
{
    var tag = stop.Attribute("tag").Value;
    var title = stop.Attribute("title").Value;
    var long = double.Parse(stop.Attribute("lon").Value, 
                            CultureInfo.InvariantCulture);
    //etc
    routeStops.add(new RouteStop() { Tag = tag } //and so on
}
0
toegevoegd
Ah bedankt, dat werkte. Maar ik denk dat je "stop" nodig had in plaats van "route".
toegevoegd de auteur Amanda_Panda, de bron
Bleh, ik krijg uitzonderingen gegooid met die code. Ik sprak te snel.
toegevoegd de auteur Amanda_Panda, de bron