如何从Post方法响应中解析xml字符串?
问题描述:
我有一个XML字符串,从Post方法返回:如何从Post方法响应中解析xml字符串?
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方法来解析并绑定到列表框。或者无论如何,有相同的结果会很好。
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;
}
答
你的方法是反转逻辑。你知道你可以有方法的返回值,右 - )
什么,你需要做的是让你的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的操作后,更改异步代码处理,执行对UI线程的回调。 然后,在你的UI线程,你会怎么做:
// This being your method to get the async response
GetResponseAsync(..., responseString =>
{
var searchResults = ParseXmlString(responseString);
listBox2.ItemsSource = searchResults;
})
你可以看到这个答案,如果你需要回调的一些基本认识:Callbacks in C#
我在哪里添加GetResponseAsync(...什么? –
正如我所说的,你需要重做你的异步代码来进行回调,这样你就可以知道它何时完成了。(还记得,你需要使用Dispatcher,因为HttpWebRequest不运行在UI线程上)。阅读最后一个链接,如果你需要了解回调是如何工作的。 –