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

如何解析带命名空间与xsi:type的XML属性?ActionResult反序列化为空

解决XML反序列化中ActionResult节点为null的问题

待解析的XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:IntegrationActionResponse xmlns:ns2="example.com">
    <ActionResults>
        <SuccessCount>1</SuccessCount>
        <FailureCount>0</FailureCount>
        <ActionResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:ParameterizedIntegrationActionResult">
            <Status>OK</Status>
            <resultParams>
                <entry>
                    <key>abc</key>
                    <value>abc</value>
                </entry>
                <entry>
                    <key>abc</key>
                    <value>abc</value>
                </entry>
                <entry>
                    <key>abc</key>
                    <value>abc</value>
                </entry>  
            </resultParams>
        </ActionResult>
    </ActionResults>
</ns2:IntegrationActionResponse>

当前使用的C#反序列化模型

using System.Collections.Generic;
using System.Xml.Serialization;

public class LoadIActionResponseModel
{
    [XmlRoot(
        IsNullable = false,
        ElementName = "IntegrationActionResponse",
        Namespace = "example.com"
    )]
    public class LoadIActionResponseModel
    {
        [XmlElement("ActionResults", Namespace = "")]
        public LoadIActionResults ActionResults { get; set; }
    }

    public class LoadIActionResults
    {
        [XmlElement(ElementName = "SuccessCount")]
        public int SuccessCount { get; set; }

        [XmlElement(ElementName = "FailureCount")]
        public int FailureCount { get; set; }

        [XmlType(TypeName = "ParameterizedIntegrationActionResult", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
        public LoadIActionResult ActionResult { get; set; }
    }
    
    public class LoadIActionResult 
    {
        [XmlElement(ElementName = "Status")]
        public string Status { get; set; }

        [XmlElement(ElementName = "resultParams")]
        public LoadIActionResultParams resultParams {get; set;}
    }
   
    public class LoadIActionEntry
    {
        [XmlElement(ElementName = "key")]
        public string Key { get; set; }

        [XmlElement(ElementName = "value")]
        public string Value { get; set; }
    }
  
    public class LoadIActionResultParams
    {
        [XmlElement(ElementName = "entry")]
        public List<LoadIActionEntry> Entries { get; set; }
    }
}

问题描述

根节点反序列化正常,但ActionResult始终返回null,需要调整模型类以兼容ActionResult节点的xmlns:xsi和xsi:type属性。

解决方案

关键问题分析

  1. xsi:type="ns2:ParameterizedIntegrationActionResult"中的ns2对应命名空间是example.com,但原模型中LoadIActionResult的XmlType特性错误地使用了xsi的命名空间(http://www.w3.org/2001/XMLSchema-instance),导致XmlSerializer无法匹配类型。
  2. LoadIActionResults中的ActionResult属性需要正确关联类型映射。

修正后的模型代码

using System.Collections.Generic;
using System.Xml.Serialization;

[XmlRoot(
    IsNullable = false,
    ElementName = "IntegrationActionResponse",
    Namespace = "example.com"
)]
public class LoadIActionResponseModel
{
    [XmlElement("ActionResults", Namespace = "")]
    public LoadIActionResults ActionResults { get; set; }
}

public class LoadIActionResults
{
    [XmlElement(ElementName = "SuccessCount")]
    public int SuccessCount { get; set; }

    [XmlElement(ElementName = "FailureCount")]
    public int FailureCount { get; set; }

    [XmlElement(ElementName = "ActionResult")]
    public LoadIActionResult ActionResult { get; set; }
}

// 将XmlType的命名空间改为example.com,匹配xsi:type中的ns2命名空间
[XmlType(TypeName = "ParameterizedIntegrationActionResult", Namespace = "example.com")]
public class LoadIActionResult 
{
    [XmlElement(ElementName = "Status")]
    public string Status { get; set; }

    [XmlElement(ElementName = "resultParams")]
    public LoadIActionResultParams resultParams { get; set; }
}

public class LoadIActionEntry
{
    [XmlElement(ElementName = "key")]
    public string Key { get; set; }

    [XmlElement(ElementName = "value")]
    public string Value { get; set; }
}

public class LoadIActionResultParams
{
    [XmlElement(ElementName = "entry")]
    public List<LoadIActionEntry> Entries { get; set; }
}

修正说明

  • 调整LoadIActionResult类的XmlType特性,将命名空间改为example.com,与XML中ns2对应的命名空间一致,确保XmlSerializer能识别xsi:type指定的类型。
  • 移除LoadIActionResults中ActionResult属性上错误的XmlType特性,保留正确的XmlElement配置,因为ActionResult节点本身属于默认空命名空间。
  • 如果后续存在多个ActionResult子类,需在模型中添加[XmlInclude(typeof(子类类型))]特性,让XmlSerializer提前注册这些类型。

测试反序列化示例

using System.IO;
using System.Xml.Serialization;

var xmlContent = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<ns2:IntegrationActionResponse xmlns:ns2=""example.com"">
    <ActionResults>
        <SuccessCount>1</SuccessCount>
        <FailureCount>0</FailureCount>
        <ActionResult xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""ns2:ParameterizedIntegrationActionResult"">
            <Status>OK</Status>
            <resultParams>
                <entry>
                    <key>abc</key>
                    <value>abc</value>
                </entry>
                <entry>
                    <key>abc</key>
                    <value>abc</value>
                </entry>
                <entry>
                    <key>abc</key>
                    <value>abc</value>
                </entry>  
            </resultParams>
        </ActionResult>
    </ActionResults>
</ns2:IntegrationActionResponse>";

var serializer = new XmlSerializer(typeof(LoadIActionResponseModel));
using var reader = new StringReader(xmlContent);
var response = (LoadIActionResponseModel)serializer.Deserialize(reader);

// 此时response.ActionResults.ActionResult已正确反序列化,不再为null

内容的提问来源于stack exchange,提问作者Shannon M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:10:28