首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法使用ReadAsAsync<T>反序列化XML响应中的列表

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

Stack Overflow用户
提问于 2019-03-06 20:53:25
回答 1查看 386关注 0票数 1

更新:这个问题与建议的重复问题不同,因为这个问题是关于XML的反序列化的,并且这个问题的解释和解决方案更加清晰,因为我已经包含了完整的源代码。

我正在尝试读取并随后操作来自Web API的响应。它的响应如下所示:

代码语言:javascript
运行
AI代码解释
复制
<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响应的类建模为:

代码语言:javascript
运行
AI代码解释
复制
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; }
}

这是我的代码:

代码语言:javascript
运行
AI代码解释
复制
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服务器中的任何东西。我只需要使用其中的数据并在其他地方使用它。

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-06 22:27:57

在一些非常好的方向之后,我解决了这个问题:https://stackoverflow.com/users/1124565/amura-cxg,非常感谢!

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

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

代码语言:javascript
运行
AI代码解释
复制
[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

代码语言:javascript
运行
AI代码解释
复制
var formatters = new List<MediaTypeFormatter>() 
    {
        new XmlMediaTypeFormatter(){ UseXmlSerializer = true } 
    };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55031955

复制
相关文章
在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
韩旭051
2020/06/22
1.8K0
粉墨登场 —— main goroutine 的诞生(三)
上一讲我们讲完了 Go scheduler 的初始化,现在调度器一切就绪,就差被调度的实体了。本文就来讲述 main goroutine 是如何诞生,并且被调度的。
梦醒人间
2019/09/05
8360
粉墨登场 —— main goroutine 的诞生(三)
IDEA运行main方法,为什么要编译整个工程?
每次在IDEA中导入工程后,想写一个类去测试一些数据,有时候只是写一个main方法进行简单的输出;
JQ实验室
2022/10/21
1.3K0
非main goroutine的退出及调度循环(15)
上一节我们说过main goroutine退出时会直接执行exit系统调用退出整个进程,而非main goroutine退出时则会进入goexit函数完成最后的清理工作,本小节我们首先就来验证一下非main goroutine执行完成后是否真的会去执行goexit,然后再对非main goroutine的退出流程做个梳理。这一节我们需要重点理解以下内容:
阿波张
2019/06/24
1.1K0
非main goroutine的退出及调度循环(15)
Go语言调度器之创建main goroutine(13)
上一节我们分析了调度器的初始化,这一节我们来看程序中的第一个goroutine是如何创建的。
阿波张
2019/06/24
1K0
Go语言调度器之创建main goroutine(13)
Go语言调度器之调度main goroutine(14)
上一节我们通过分析main goroutine的创建详细讨论了goroutine的创建及初始化流程,这一节我们接着来分析调度器如何把main goroutine调度到CPU上去运行。本节需要重点关注的问题有:
阿波张
2019/06/24
8240
Go语言调度器之调度main goroutine(14)
源码分析go调度器三: main goroutine的执行
上一节创建好了main goroutine,并将其放入了allp[0]的runnext中,这一节分析main goroutine是如何被调度到cpu上执行的
玖柒的小窝
2021/10/06
4140
源码分析go调度器三: main goroutine的执行
为什么是int main()而不是void main()
这是基于我们学校老师一直使用void main(),而发的感慨,大一学习C语言时,我就在想,老师上课演示的为什么一直用void main(),而不是int main()呢?不为了偷懒?还是习惯性的语句呢?在查阅了部分大牛的博客,翻阅了C Primer Plus和C++ Primer Plus这两本圣经级别的书本之后,得出以下结论(有一部分是别人的结论,属于半转载),可能不太严谨,请多多包涵。
对弈
2019/09/04
3.7K0
为什么SpringBoot的 jar 可以直接运行?
SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可:
JAVA葵花宝典
2020/04/23
1.2K0
为什么SpringBoot的jar可以直接运行
Spring Boot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。在pom文件里加入这个插件即可:
用户4283147
2022/10/27
3170
Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提“Python 的 main 函数”、“建议写 main 函数”……
Python猫
2020/06/04
2.5K0
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstation。有关更多详细信息,请访问 http://www.vmware.com/go/turnoff_CG_DG。
walterlv
2023/10/22
2.2K0
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati 搜索控制面板   找到卸载页面 启用或关闭Windows功能   关闭 Hyper-V 然后重启电脑即可
韩旭051
2022/05/09
9900
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati(100%解决)
红目香薰
2022/11/29
2.9K0
VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VMware Workstati
面试:main 方法可以继承吗?
昨天,微信群里一位网友,在群里发了自己面试的过程。其中一个面试,他在群里 PUA 其他网友。这道面试题就是:Java 中的 main 方法可以继承吗?
Java旅途
2022/03/04
7080
java中main方法的运行
转载自:https://blog.csdn.net/WGYH_3767/article/details/76933676
全栈程序员站长
2022/08/31
1.2K0
漫谈如何终止 JS 程序的运行
最近在开发一个 JSSDK 的时候有一个需求:为了检测当前环境中是否已经加载过该脚本,需要在脚本开始运行时加入一层判断,如果检测到已存在该脚本导出的变量,则终止脚本的后续运行,否则再执行后续逻辑。 那么便碰上了本文标题的问题:如何终止 JS 程序的运行?
逆葵
2019/04/25
7.8K0
漫谈如何终止 JS 程序的运行
Yarn运行中的任务如何终止?
我们的作业是使用yarn来调度的,那么肯定就需要使用相关的命令来进行管理,简单的有查询任务列表和killed某一个正在运行中的任务。
大数据真好玩
2021/03/30
7.4K0
Yarn运行中的任务如何终止?
为什么Python没有main函数?
众所周知,Python中没有所谓的main函数,但是网上经常有文章提到“ Python的main函数”和“建议编写main函数”。
AI科技大本营
2020/07/24
1.8K0
在Linux中查看及终止正在运行的后台程序方法
-l选项可显示所有任务的PID,jobs的状态可以是running, stopped,
习惯说一说
2019/07/15
13.9K0

相似问题

在Kubernetes容器被终止后,goroutine会终止吗?

19

我们可以在goroutine中实现goroutine吗?

238

调用函数返回时Goroutine终止

22

为什么线程在main方法执行后运行?

40

惯用goroutine终止和错误处理

59
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文