【问题标题】:How to use HttpClient to read an XML response?如何使用 HttpClient 读取 XML 响应?
【发布时间】:2013-11-25 09:18:06
【问题描述】:

显然HttpClient 是发出 HTTP 请求的新推荐方式,因此我尝试使用它向 Delicious API 发出请求,该 API 返回一个 XML 响应。这是我得到的:

internal class Program
{
    private static void Main(string[] args)
    {
        var credentials = new NetworkCredential("username", "password");
        var handler = new HttpClientHandler { Credentials = credentials};
        var client = new HttpClient(handler);

        var suggest = new Uri("https://api.del.icio.us/v1/posts/suggest");

        var suggestions =
            client.GetAsync(suggest.AddQueryParams("url", "https://yahoo.com"))
                .ContinueWith(t => t.Result.Content.ReadAsAsync<DeliciousSuggest>())
                .Unwrap()
                .Result;



        Console.ReadLine();
    }
}

public class DeliciousSuggest
{
    public string[] Popular { get; set; }
    public string[] Recommended { get; set; }
    public string[] Network { get; set; }
}

但是,它会在 ReadAsAsync 位上引发异常,

附加信息:无法加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或其依赖项之一。系统找不到指定的文件。

也许我错过了一些程序集,但这让我很反感。返回类型是 XML,而不是 JSON,但我仍然不太确定这个 ReadAsAsync 方法是如何工作的,或者我什至会如何指定它。

示例响应如下所示:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<suggest>
<popular>yahoo!</popular>
<popular>yahoo</popular>
<popular>web</popular>
<popular>tools</popular>
<popular>searchengines</popular>
<recommended>yahoo!</recommended>
<recommended>yahoo</recommended>
<recommended>web</recommended>
<network>for:Bernard</network>
<network>for:britta</network>
<network>for:deusx</network>
</suggest>

我怎样才能把它解析成一些可用的格式?

【问题讨论】:

标签: c# httpclient


【解决方案1】:

“我怎样才能把它解析成一些可用的格式?”

    [XmlRoot("suggest")]
public class DeliciousSuggest {
    [XmlElement("popular")]
    public string[] Popular { get; set; }

    [XmlElement("recommended")]
    public string[] Recommended { get; set; }

    [XmlElement("network")]
    public string[] Network { get; set; }
}

并使用 XmlSerializer 进行反序列化。


您应该将 del.icio.us 的响应作为字符串读回,然后您可以按如下方式对其进行反序列化:

var s = "this is the response from del"; 
var buffer = Encoding.UTF8.GetBytes(s); 
using (var stream = new MemoryStream(buffer)) { 
    var serializer = new XmlSerializer(typeof(DeliciousSuggest)); 
    var deliciousSuggest = (DeliciousSuggest)serializer.Deserialize(stream); 
    //then do whatever you want
}

【讨论】:

  • 嗯,这是答案的一部分。你是说我应该将响应读取为字符串并使用 XmlSerializer 作为单独的步骤对其进行解析?
  • var s = "这是del的回复"; var buffer = Encoding.UTF8.GetBytes(s);使用 (var stream = new MemoryStream(buffer)) { var serializer = new XmlSerializer(typeof(DeliciousSuggest)); var deliciousSuggest = (DeliciousSuggest)serializer.Deserialize(stream); //然后做任何你想做的}
  • 我会认为这是“是”。我已经使用您提供的代码编辑了您的答案,使其更清晰。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2011-05-12
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
相关资源
最近更新 更多