Как разобрать строку XML из ответа метода Post? - PullRequest
0 голосов
/ 17 августа 2011

У меня есть строка XML, которая возвращается из метода Post:

private static void GetResponseCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
    HttpStatusCode rcode = response.StatusCode;

    var stream = new GZipInputStream(response.GetResponseStream());
    using (StreamReader reader = new StreamReader(stream))
    {
        responseString = reader.ReadToEnd();                
    }          

    response.Close();
}

responseString - это строка, которую я хочу проанализировать, используя класс parseXmlString ниже. Однако я не могу вызвать метод parseXmlString напрямую из-за статического. Как я могу передать responseString в метод parseXmlString, чтобы они анализировали и привязывали к listBox. Или в любом случае иметь тот же результат было бы здорово.

void parseXmlString()
{
    byte[] byteArray = Encoding.UTF8.GetBytes(responseString);
    MemoryStream str = new MemoryStream(byteArray);
    str.Position = 0;

    XDocument xdoc = XDocument.Load(str);

    var data = from query in xdoc.Descendants("tracks").Elements("item")
               select new searchResult
               {
                   artist = (string)query.Element("artist"),
                   album = (string)query.Element("album"),
                   track = (string)query.Element("track"),
                   //   artistA = (string)query.Element("artists").Element("artist"),
               };
    //  ListBox lb = new ListBox();

    listBox1.ItemsSource = data;

    var data1 = from query in xdoc.Descendants("artists").Elements("item")
                select new searchResult
                {
                    artistA = (string)query.Element("artist"),
                };
    listBox2.ItemsSource = data1;
}

1 Ответ

1 голос
/ 17 августа 2011

Ваш подход - обратная логика.Вы знаете, что вы можете иметь возвращаемые значения для методов, верно? -)

Что вам нужно сделать, это позволить вашему ParseXmlString методу принять responseString в качестве параметра и позволить ему вернуть созданное IEnumerable вот так:

private IEnumerable<SearchResult> ParseXmlString(responseString)
{
    XDocument xdoc = XDocument.Load(responseString);

    var data =
        from query in xdoc.Descendants("tracks").Elements("item")
        select new SearchResult
        {
           Artist = (string)query.Element("artist"),
           Album = (string)query.Element("album"),
           Track = (string)query.Element("track"),
        };

    return
        from query in xdoc.Descendants("artists").Elements("item")
        select new SearchResult
        {
           ArtistA = (string)query.Element("artist"),
        };
}

И измените обработку асинхронного кода, чтобы выполнить обратный вызов в ваш поток пользовательского интерфейса, когда он завершит чтение responseString.Затем в потоке пользовательского интерфейса вы должны сделать:

// This being your method to get the async response
GetResponseAsync(..., responseString =>
{
    var searchResults = ParseXmlString(responseString);
    listBox2.ItemsSource = searchResults;
})

Вы можете увидеть этот ответ, если вам нужно некоторое базовое понимание обратных вызовов: Обратные вызовы в C #

...