C# 使用多个可能的命名空间反序列化 xml

Posted

技术标签:

【中文标题】C# 使用多个可能的命名空间反序列化 xml【英文标题】:C# deserializing xml with multiple possible namespaces 【发布时间】:2011-06-25 17:33:55 【问题描述】:

我创建了一个 API 包装类库,用于使用来自第三方的 REST API。

直到他们最近在其产品的最新版本中更新了 API 并向根元素添加了一个命名空间,这一切都正常工作,现在我的反序列化代码失败了。

我的一个类的一个例子:

[Serializable]
[XmlRootAttribute(ElementName = "exit_survey_list")]
public class SupportExitSurveyCollection : ApiResult  .... 

如果我将 XmlRootAttribute 中的 Namespace 属性设置为返回的新命名空间,那么它会再次正常工作。

但我需要同时支持 API 的两个版本(命名空间和非命名空间),因为我不能确定哪个版本的 API 可用。

我希望在不为不同版本复制类的情况下使其正常工作,但不确定是否可行。

感谢您的任何意见/建议。

【问题讨论】:

【参考方案1】:

我认为这是不可能的。

您可以实现IXmlSerializable 接口,并自己控制序列化 - 这可行,但可能不是您想要的,因为它需要您自己在代码中进行大量映射。

另一个选项是预处理消息并在缺少命名空间时添加命名空间。然后你可以有一个单一的反序列化过程。

【讨论】:

感谢您的想法,我走预处理路线并删除了所有命名空间声明。我认为如果他们决定再次更改命名空间,这将允许它在未来继续工作。

以上是关于C# 使用多个可能的命名空间反序列化 xml的主要内容,如果未能解决你的问题,请参考以下文章

C# 在忽略命名空间的同时反序列化 xml

反序列化 xml,包括命名空间

c# XmlSerializer 反序列化器缺少默认命名空间

由于命名空间而无法反序列化 xml

XmlSerializer c++ 使用多个命名空间反序列化

Jackson XML - 使用命名空间前缀反序列化 XML