如何解析带命名空间与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属性。
解决方案
关键问题分析
xsi:type="ns2:ParameterizedIntegrationActionResult"中的ns2对应命名空间是example.com,但原模型中LoadIActionResult的XmlType特性错误地使用了xsi的命名空间(http://www.w3.org/2001/XMLSchema-instance),导致XmlSerializer无法匹配类型。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
相关产品推荐
相关产品推荐

