【问题标题】:Deserializing xml with multiple namespaces使用多个命名空间反序列化 xml
【发布时间】:2016-05-14 08:48:56
【问题描述】:

我使用的数据源总是通过相同的父类(xml 中的模型)发送数据,并使用 xsi:type 来确定类的实际类型。在他们开始向 xsi:type 添加命名空间之前,这一直运行良好。现在无论我尝试什么,它都不会反序列化。

这是 XML:

<ModelResource xmlns:ot="http://www.example.com/otSpace">
  <Models xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xsi:type="ot:myChildClass">
    Stuff here
  </Models>
</ModelResource>

根节点

[XmlRoot("ModelResource")]
public class XmlRoot
{
    [XmlElement("Models")]
    public List<BaseObject> Bases { get; set; }
}

父类

[XmlInclude(typeof(MyChildClass))]
public abstract class BaseObject
{
}

子类

[XmlType(TypeName = "myChildClass", Namespace = "http://www.example.com/otSpace")]
public class MyChildClass : BaseObject
{
}

当我反序列化这个 XML 时,我得到了错误:

{"指定类型未被识别:name='myChildClass', namespace='http://www.example.com/otSpace', at ."}

感谢您的帮助。

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    这些类适用于您的示例。我将这些类命名为与元素名称相同,只是为了更容易理解:

    public class ModelResource
    {
        public Models Models { get; set; }
    }
    
    [XmlInclude(typeof(MyChildClass))]
    [XmlRoot(Namespace = "")]
    public abstract class Models
    {
    }
    
    [XmlType("myChildClass", Namespace = "http://www.example.com/otSpace")]
    public class MyChildClass : Models
    {
        [XmlText]
        public string Value { get; set; }
    }
    

    请参阅this fiddle 以获得工作演示。

    【讨论】:

    • 谢谢!将父命名空间显式设置为 "" 是缺失的部分。现在我必须处理这样一个事实,虽然 MyChildClass 属于该命名空间,但它的所有属性都不属于该命名空间,所以我还需要将它们全部显式设置为 "",但这只是一件很忙的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2013-05-02
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多