亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法使用 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 關注
  • 118 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號