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

我正在尝试读取并随后操作来自 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 服务器中的任何内容。我只需要使用其中的数据并在其他地方使用它。


太感谢了!


至尊宝的传说
浏览 62回答 1
1回答

HUWWW

经过一些非常好的指导后,我解决了这个问题:https&nbsp;://stackoverflow.com/users/1124565/amura-cxg非常感谢!解决方案是使用 XMLAttributes 注释所有属性。它正确地反序列化了响应。至于Resource属性,我所需要的只是[XmlAttribute(AttributeName="Resource")]其余的源代码按原样工作。[XmlRoot(ElementName="MYAPI")]public class MYAPI&nbsp;{&nbsp; &nbsp; [XmlElement(ElementName="MySite")]&nbsp; &nbsp; public List<MySite> MySite { get; set; }&nbsp; &nbsp; [XmlElement(ElementName="SomeOtherSite")]&nbsp; &nbsp; public SomeOtherSite SomeOtherSite { get; set; }}public class MySite&nbsp;{&nbsp; &nbsp; [XmlElement(ElementName="Name")]&nbsp; &nbsp; public string Name { get; set; }&nbsp; &nbsp; [XmlElement(ElementName="URL")]&nbsp; &nbsp; public string URL { get; set; }&nbsp; &nbsp; [XmlElement(ElementName="SecondName")]&nbsp; &nbsp; public string SecondName { get; set; }&nbsp; &nbsp; [XmlAttribute(AttributeName="Resource")]&nbsp; &nbsp; public string Resource { get; set; }}另外,我不需要任何自定义媒体格式化程序。从https://stackoverflow.com/users/1855967/elisabeth的一篇文章中,我了解到我们不应该接触 xsd.exe 工具生成的文件。所以我明确设置使用默认XmlSerializer而不是DataContractSerializer使用:var formatters = new List<MediaTypeFormatter>()&nbsp;&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; new XmlMediaTypeFormatter(){ UseXmlSerializer = true }&nbsp;&nbsp; &nbsp; };
打开App,查看更多内容
随时随地看视频慕课网APP