Windows phone 7 читает XML с помощью XDocument - PullRequest
1 голос
/ 12 апреля 2011

Привет, я пытаюсь сделать свое первое приложение для Windows Phone 7. Это включает в себя запрос сервера о полетной информации. Затем получение XML-документа. Затем я хочу создать серию объектов на основе XML, который я получаю. Однако существует проблема, так как значения объекта являются пустыми.

Мой код

    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

и секция XML, которую я хочу, выглядит следующим образом. Это также первое использование тега Flight в XML. Добавлено начало XML-файла длиной в сотни строк, так что не будет, но все закончится. Метка Полета, которую я хочу, сгорела там.

<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>

Я, вероятно, совершил простую ошибку. Вся помощь приветствуется. Благодарю. отредактируйте im теперь, получая ошибку передачи метода. Я изменил дату и время на строку для простоты

1 Ответ

0 голосов
/ 12 апреля 2011

Полагаю, вы не показываете нам полный XML, и в нем, вероятно, указано пространство имен по умолчанию. Пространство имен будет выглядеть как xmlns="http://www.domain.com". Если это действительно так, то ваши запросы LINQ to XML должны ссылаться на это пространство имен, и это можно сделать следующим образом:

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")
              };

Обратите внимание, что перед каждым именем элемента необходимо ставить пространство имен, поэтому во всем коде следует использовать ns +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...