【问题标题】:How to parse XML response using HttpClient in .Net 4.0 to .Net Class?如何使用 .Net 4.0 中的 HttpClient 将 XML 响应解析为 .Net 类?
【发布时间】:2015-04-18 07:52:18
【问题描述】:

我有一个返回 xml 作为响应的 Web 服务。

下面是他的xml响应截图:

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <Header>
        <Message type="String"></Message>
    </Header>
    <Output>
        <Rows>
            <Row>
                <Result type="Integer">1021806</Result>
            </Row>
        </Rows>
    </Output>
</Root>

这是代表 xml 响应的我的 .net 模型:

    public class ResponseModel
    {
        public class Root
        {
            public Header header { get; set; }
            public Output output { get; set; }
        }
        public class Header
        {
            public string Message { get; set; }
        }
        public class Output
        {
            public List<Row> Rows { get; set; }
        } 
        public class Row
        {
            public int Result { get; set; }
        }
    }

我正在使用HttpClient类向指定的web服务发送请求。

这是我的代码:

    using (var client = new System.Net.Http.HttpClient())
    {
         client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));
         var response = client.GetAsync("myWebServiceUrl").Result;
         if (response.IsSuccessStatusCode)
         {
            var responseContent = response.Content; 
         }
     }

responseContent 有三种方法:

ReadAsStringAsync()
ReadAsStreamAsync()
ReadAsByteArrayAsync()

这三种方法有什么区别?

xml 响应应该使用哪一个以及如何将 xml 解析为所需的ResponseModel

【问题讨论】:

  • 您是否在服务客户之间共享模型代码?
  • 你为什么要这样访问网络服务?为什么不在 VS 中将其用作 ServiceReference?
  • 什么意思?你能详细说明一下吗?

标签: c# .net xml httpclient


【解决方案1】:

如何使用“DataContractSerializer”并使用 ReadObject 方法?它看起来或多或少是这样的:

var serializer = new DataContractSerializer(typeof(ResponseModel.Root));
var stream = await responseContent.ReadAsStreamAsync();
var response = serializer.ReadObject(stream) as ResponseModel;

【讨论】:

  • 是否需要在 ReadObject 方法中传递根元素?
  • 是的,序列化器需要一个 ResponseModel.Root 类型,我会修改我的答案
  • 您可能需要更改模型以将大写放在标题和输出中,或者在名称与服务响应不同的字段上使用“DataContractAttribute”:[DataMember(Name = "Output")]
  • 自从我拥有 .net 4.0 以来我做了一件事,所以我删除了 await 并在 ReadAsStreamAsync(); 中调用了 .Result;所以它变成了 var stream = responseContent.ReadAsStreamAsync().Result;这会影响你的回答吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多