如何从指定外部Web服务加载XML至本地对象?
解决从英国议会XML服务反序列化到C#对象的问题
看起来你已经迈出了第一步——定义了对应XML字段的C#类并添加了XML序列化属性,不过我注意到你的代码还没写完,而且有几个关键细节需要调整才能顺利完成反序列化。我来帮你梳理完整的实现方案:
首先,补全并修正你的Member类定义
XmlSerializer默认只处理公共属性,所以你的字段必须设为public,另外要添加XmlRoot属性来匹配返回XML的根节点(可以先在浏览器打开目标URL确认根节点名称):
using System.Xml.Serialization; // 这里的根节点名称要和返回XML的根标签一致,比如返回的XML根是<Member>就写"Member" [XmlRoot("Member")] public class Member { [XmlElement("DisplayAs")] public string DisplayAs { get; set; } [XmlElement("ListAs")] public string ListAs { get; set; } [XmlElement("FullTitle")] public string FullTitle { get; set; } // 后续如果有其他XML字段,直接按这个格式添加XmlElement属性即可 }
然后,实现从URL加载XML并反序列化的逻辑
用HttpClient获取XML内容,再通过XmlSerializer将其转换为你的Member对象:
using System.Net.Http; using System.Xml.Serialization; using System.IO; public async Task<Member> FetchParliamentMemberAsync() { string targetUrl = "http://data.parliament.uk/membersdataplatform/services/mnis/members/query/fymp=ST1"; using (HttpClient httpClient = new HttpClient()) { try { // 获取XML字符串内容 string xmlResponse = await httpClient.GetStringAsync(targetUrl); // 初始化序列化器,指定目标对象类型 XmlSerializer serializer = new XmlSerializer(typeof(Member)); // 将XML字符串反序列化为Member实例 using (StringReader stringReader = new StringReader(xmlResponse)) { return (Member)serializer.Deserialize(stringReader); } } catch (HttpRequestException ex) { // 处理网络请求失败的情况 Console.WriteLine($"请求出错: {ex.Message}"); return null; } catch (InvalidOperationException ex) { // 处理XML反序列化失败的情况(比如结构不匹配) Console.WriteLine($"反序列化出错: {ex.Message}"); return null; } } }
几个关键注意事项
- 确认XML结构:先在浏览器打开目标URL,查看返回的XML根节点名称、是否有命名空间、是否是多个成员的列表。如果返回的是
<Members>包裹的多个<Member>,你需要定义一个容器类来承载列表:
此时反序列化时要使用[XmlRoot("Members")] public class MemberCollection { [XmlElement("Member")] public List<Member> Members { get; set; } }typeof(MemberCollection)。 - 命名空间处理:如果XML带有命名空间,需要在
XmlRoot和XmlElement中指定Namespace属性,比如[XmlRoot(ElementName = "Member", Namespace = "http://your-namespace-url")]。 - 属性访问权限:一定要保持属性为
public,否则XmlSerializer无法读取或写入这些属性。
内容的提问来源于stack exchange,提问作者Web Develop Wolf
相关产品推荐
相关产品推荐

