Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用ReadAsAsync反序列化XML响应中的列表<;T>;_C#_Rest_Asp.net Web Api_Httpclient_Xml Serialization - Fatal编程技术网

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

C# 无法使用ReadAsAsync反序列化XML响应中的列表<;T>;,c#,rest,asp.net-web-api,httpclient,xml-serialization,C#,Rest,Asp.net Web Api,Httpclient,Xml Serialization,[更新:此问题与建议的重复问题不同,因为此问题与XML的反序列化有关,并且此问题和解决方案的解释更清晰,因为我已包含完整的源代码。] 我试图读取并随后操纵来自Web API的响应。其反应如下: <MYAPI xsi:noNamespaceSchemaLocation="MYAPI.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <MySite Resource="some resource name"

[更新:此问题与建议的重复问题不同,因为此问题与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>
这是我的代码:

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;
    }
}
static void Main()
{
var handler=new-HttpClientHandler();
handler.Credentials=newnetworkcredential(“MyUsername”、“MyPassword”);
var client=新的HttpClient(处理程序);
client.BaseAddress=新Uri(“https://sitename.com:PortNumber/");
var formatters=新列表()
{
新的XmlMediaTypeFormatter(){UseXmlSerializer=true}
};
var myApi=新的myApi();
httpresponsemessageresponse=client.GetAsync(“/api/mysites”).Result;
if(响应。IsSuccessStatusCode)
{
myApi=response.Content.ReadAsAsync(格式化程序).Result;
}
}
现在,
myApi
只有
SomeOtherSite
的对象,但是
MySite
的列表是空的。 有人能告诉我如何正确地反序列化这个响应吗? 我应该创建自定义媒体格式化程序吗?顺便说一下,我不知道

另外,您能否告诉我如何对响应中的
资源
属性进行建模

我不能在WebAPI服务器中更改任何内容。我只需要使用其中的数据并在其他地方使用它


非常感谢你

我在从以下几方面得到了很好的指导后解决了这个问题:非常感谢

解决方案是用XMLAttributes注释所有属性。它正确地反序列化了响应。至于
资源
属性,我只需要
[xmltattribute(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; }
}

关于
列表的问题
试着看一下。至于
资源
属性,您应该能够使用XmlAttributeAttribute,请参见我为您构建了一个可能重复的示例
[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; }
}
var formatters = new List<MediaTypeFormatter>() 
    {
        new XmlMediaTypeFormatter(){ UseXmlSerializer = true } 
    };