为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用 ReadAsAsync<T> 反序列化 XML 响应中的列表

无法使用 ReadAsAsync<T> 反序列化 XML 响应中的列表

C#
至尊宝的传说 2022-10-15 14:18:16
我正在尝试读取并随后操作来自 Web API 的响应。它的响应如下所示:<MYAPI xsi:noNamespaceSchemaLocation="MYAPI.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">   <MySite Resource="some resource name">       <Name>some name</Name>       <URL>some url</URL>       <SecondName>Describes something</SecondName>   </MySite>   ... A lot of these <MySite>...</MySite> are there            <SomeOtherSite Resource="some resource name">       <Name>some name</Name>       <URL>some url</URL>   </SomeOtherSite></MYAPI>SomeOtherSite没有重复,只有其中一个出现在响应的末尾。但这MySite是重复的。我已将此 XML 响应的类建模为:public class MYAPI{    public List<MySite> MySite { get; set; }    public SomeOtherSite SomeOtherSite { get; set; }}public class MySite{    public string Name { get; set; }    public string URL { get; set; }    public string SecondName { get; set; }}public class SomeOtherSite{    public string Name { get; set; }    public string URL { get; set; }}这是我的代码:static void Main(){    var handler = new HttpClientHandler();    handler.Credentials = new NetworkCredential("MyUsername", "MyPassword");    var client = new HttpClient(handler);    client.BaseAddress = new Uri("https://sitename.com:PortNumber/");    var formatters = new List<MediaTypeFormatter>()     {        new XmlMediaTypeFormatter(){ UseXmlSerializer = true }     };    var myApi = new MYAPI();    HttpResponseMessage response = client.GetAsync("/api/mysites").Result;    if (response.IsSuccessStatusCode)    {        myApi = response.Content.ReadAsAsync<MYAPI>(formatters).Result;    }}现在myApi唯一的对象是,SomeOtherSite但列表MySite是空的。有人能告诉我应该如何正确反序列化这个响应吗?我应该创建自定义媒体格式化程序吗?顺便说一句,我对此一无所知。另外,您能否告诉我如何对Resource响应中出现的该属性进行建模?而且我无法更改 WebAPI 服务器中的任何内容。我只需要使用其中的数据并在其他地方使用它。太感谢了!
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

经过一些非常好的指导后,我解决了这个问题:https ://stackoverflow.com/users/1124565/amura-cxg非常感谢!

解决方案是使用 XMLAttributes 注释所有属性。它正确地反序列化了响应。至于Resource属性,我所需要的只是[XmlAttribute(AttributeName="Resource")]

其余的源代码按原样工作。

[XmlRoot(ElementName="MYAPI")]

public class MYAPI 

{

    [XmlElement(ElementName="MySite")]

    public List<MySite> MySite { get; set; }


    [XmlElement(ElementName="SomeOtherSite")]

    public SomeOtherSite SomeOtherSite { get; set; }

}


public class MySite 

{

    [XmlElement(ElementName="Name")]

    public string Name { get; set; }


    [XmlElement(ElementName="URL")]

    public string URL { get; set; }


    [XmlElement(ElementName="SecondName")]

    public string SecondName { get; set; }


    [XmlAttribute(AttributeName="Resource")]

    public string Resource { get; set; }

}

另外,我不需要任何自定义媒体格式化程序。从https://stackoverflow.com/users/1855967/elisabeth的一篇文章中,我了解到我们不应该接触 xsd.exe 工具生成的文件。所以我明确设置使用默认XmlSerializer而不是DataContractSerializer使用:


var formatters = new List<MediaTypeFormatter>() 

    {

        new XmlMediaTypeFormatter(){ UseXmlSerializer = true } 

    };


查看完整回答
反对 回复 2022-10-15
  • 1 回答
  • 0 关注
  • 54 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信