You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从指定外部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:21:28