2011-04-12 4 views
1

Salut im essayant de faire ma première application Windows Phone 7. Cela implique d'interroger un serveur sur les informations de vol. Puis recevoir un document XML. Je veux ensuite créer une série d'objets basés sur le XML que je récupère. Cependant, il y a un problème car les valeurs de l'objet sont vides.Téléphone Windows 7 lecture XML avec XDocument

Mon code

private void SearchButton_Click(object sender, RoutedEventArgs e) 
    { 
     getResults("http://test.com/"); 
    } 

    public void getResults(string websiteURL) 
    { 
     WebClient c = new WebClient(); 
     c.DownloadStringAsync(new Uri(websiteURL)); 
     c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(c_DownloadStringCompleted); 
    } 

    void c_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     lock (this) 
     { 
      string s = e.Result; 
      XmlReader r = XmlReader.Create(new MemoryStream(System.Text.UnicodeEncoding.Unicode.GetBytes(s))); 
      // So something with the XML we get back 
      XDocument data = XDocument.Load(r); 
      var ns = data.Root.GetDefaultNamespace(); 
      var flights = from query in data.Descendants(ns+"Flight") 
           select new Flight 
           { 
            AircraftType = (int)query.Element(ns + "AircraftType"), 
            ArrivalTerminal = (int)query.Element(ns + "ArrivalTerminal"), 
            Carrier = (string)query.Element(ns + "Carrier"), 
            DepartureTerminal = (int)query.Element(ns + "DepartureTerminal"), 
            Duration = (string)query.Element(ns + "Duration"), 
            EndDateTime = (string)query.Element(ns + "EndDateTime"), 
            EndPoint = (string)query.Element(ns + "EndPoint"), 
            FlightIndexNo = (int)query.Element(ns + "FlightIndexNo"), 
            FlightNo = (int)query.Element(ns + "FlightNo"), 
            NumStops = (int)query.Element(ns + "NumStops"), 
            OperatedBy = (string)query.Element(ns + "OperatedBy"), 
            StartDateTime = (string)query.Element(ns + "StartDateTime"), 
            StartPoint = (string)query.Element(ns + "StartPoint") 
           }; 
      //checking if anything is there. 
      string result =""; 

      foreach (Flight i in flights) 
      { 
       result += i.Carrier; 
      } 
      resultsBlock.Text = result; 


     } 
    } 

    public class Flight 
    { 
     public int aircraftType; 
     public int arrivalTerminal; 
     public string carrier; 
     public int departureTerminal; 
     public string duration; 
     public string endDateTime; 
     public string endPoint; 
     public int flightIndexNo; 
     public int flightNo; 
     public int numStops; 
     public string operatedBy; 
     public string startDateTime; 
     public string startPoint; 

     //Getter and setters 

et la section XML que je veux ressemble à ceci. C'est également la première utilisation de la balise Flight dans le fichier XML. Ajouté le début de l'ensemble XML est des centaines de lignes de long, donc pas tout, mais tout. L'étiquette de vol que je veux est enfoncée là-bas.

<FindFlightsResponse xmlns="urn:webjet.com.au" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<DisplayMessage i:nil="true" /> 
<OutboundFlightInfo> 
      ... 
       <Flight> 
        <AircraftType>734</AircraftType> 
        <ArrivalTerminal>3</ArrivalTerminal> 
        <Carrier>QF</Carrier> 
        <DepartureTerminal>1</DepartureTerminal> 
        <Duration>PT1H25M</Duration> 
        <EndDateTime>2011-04-20T07:25:00</EndDateTime> 
        <EndPoint>SYD</EndPoint> 
        <FlightIndexNo>1</FlightIndexNo> 
        <FlightNo>400</FlightNo> 
        <NumStops>0</NumStops> 
        <OperatedBy>QF</OperatedBy> 
        <StartDateTime>2011-04-20T06:00:00</StartDateTime> 
        <StartPoint>MEL</StartPoint> 
       </Flight> 

J'ai probablement fait une erreur simple. Toute aide appréciée. Merci. éditer im maintenant obtenir une erreur de transmission de méthode. J'ai changé le datetime en chaîne pour la simplicité

Répondre

0

Je suppose que vous ne nous montrez pas le code XML complet et il a probablement un espace de noms par défaut spécifié. Un espace de noms ressemblera à xmlns="http://www.domain.com". Si tel est le cas, alors votre LINQ aux requêtes XML pour référencer cet espace de noms, et cela peut se faire comme suit:

var ns = data.Root.GetDefaultNamespace(); 
var flights = from query in data.Descendants(ns + "Flight") 
       select new Flight 
       { 
        AircraftType = (int)query.Element(ns + "AircraftType"), 
        ArrivalTerminal = (int)query.Element(ns + "ArrivalTerminal"), 
        Carrier = (string)query.Element(ns + "Carrier"), 
        DepartureTerminal = (int)query.Element(ns + "DepartureTerminal"), 
        Duration = (string)query.Element(ns + "Duration"), 
        EndDateTime = (DateTime)query.Element(ns + "EndDateTime"), 
        EndPoint = (string)query.Element(ns + "EndPoint"), 
        FlightIndexNo = (int)query.Element(ns + "FlightIndexNo"), 
        FlightNo = (int)query.Element(ns + "FlightNo"), 
        NumStops = (int)query.Element(ns + "NumStops"), 
        OperatedBy = (string)query.Element(ns + "OperatedBy"), 
        StartDateTime = (DateTime)query.Element(ns + "StartDateTime"), 
        StartPoint = (string)query.Element(ns + "StartPoint") 
       }; 

Notez que vous devez préfixer chaque nom d'élément avec l'espace de noms, d'où l'utilisation de ns + dans tout le code.

+0

Merci Ahmad vous avez raison, il y avait un espace de nommage spécifié. Cependant j'ai fait les changements et ai toujours le même problème – user704314

+0

@ user704314 pouvez-vous mettre à jour votre question avec les changements faits et montrer plus de XML avec l'espace de noms? –

+0

J'ai mis à jour le code et ai changé les arguments datetime pour la simplicité parce que maintenant j'obtiens une erreur indiquant que FormatException n'a pas été manipulé quand je crée un nouveau vol. – user704314

Questions connexes