C# XML反序列化无法解析属性类型

C# XML反序列化无法解析属性类型,c#,xml,xml-serialization,asp.net-web-api2,xml-deserialization,C#,Xml,Xml Serialization,Asp.net Web Api2,Xml Deserialization,我正在从事一个项目,在这个项目中,我通过REST和Comet语义与API服务进行通信 XML 所以,问题就在眼前。 我在尝试反序列化以下XML时收到此错误 解析类型“xsi:SubscriptionEvent”时出错 NetBike.Xml.TypeResolvers.XmlTypeResolveException 注意:我使用NetBike,但默认xml格式化程序中也存在错误 <?xml version="1.0" encoding="UTF-8"?> <xsi:Event

我正在从事一个项目,在这个项目中,我通过REST和Comet语义与API服务进行通信

XML 所以,问题就在眼前。 我在尝试反序列化以下XML时收到此错误

解析类型“xsi:SubscriptionEvent”时出错 NetBike.Xml.TypeResolvers.XmlTypeResolveException

注意:我使用NetBike,但默认xml格式化程序中也存在错误

<?xml version="1.0" encoding="UTF-8"?>
<xsi:Event
xsi1:type="xsi:SubscriptionEvent"
xmlns:xsi="http://schema.broadsoft.com/xsi"
xmlns:xsi1="http://www.w3.org/2001/XMLSchema-instance">
<xsi:eventID>0787e727-e73d-43e0-a7b1-e968ba72ea53</xsi:eventID>
<xsi:sequenceNumber>1</xsi:sequenceNumber>
<xsi:userId>11111111@voip.company.domain</xsi:userId>
<xsi:externalApplicationId>NewClient</xsi:externalApplicationId>
<xsi:subscriptionId>24def51b-21fb-4d60-a1ef-67477dcafcfb</xsi:subscriptionId>
<xsi:channelId>575cfe44-2cc7-4cf5-bc05-bcc462bcbb02</xsi:channelId>
<xsi:targetId>22222222@voip.company.domain</xsi:targetId>
<xsi:eventData xsi1:type="xsi:ACDSubscriptionEvent"/>
</xsi:Event>

C级 我使用的是C#,直到现在,基于开发时返回给我的XML创建等价类都没有问题。 如果我去掉“坏数据”,则可以避免异常

事件类(我在WebAPIv2环境中使用它,所以从技术上讲它是一个模型)

这个类主要是由 (这大大加快了这项枯燥的任务)


有效的XML? 当我通过不同的XML验证器运行XML时,会得到不同的响应,有些会很好地验证XML,有些则不会

  • :失败
  • :失败
  • :好的
对我来说,我发现很难理解这个结构到底应该如何工作。 似乎type属性应该建立在xsi1属性的基础上,但我尝试的一切都失败了

我最后的办法是将响应读取为字符串,然后去掉恼人的XML,以便可以正确地对其进行反序列化

致以最良好的祝愿。
有点沮丧的开发人员迫切需要帮助。

我认为出现这种混乱是因为
xsi:type
是XML模式的一部分,定义了各种元素的类型。您试图将其视为普通属性,而serialiser试图使用它来确定将数据映射到哪些对象。它要查找的对象未在模型中定义

本质上,您需要按照XML所暗示的类型层次结构对类进行建模。因此,您有一个带有
SubscriptionEvent
子类的基本
Event
类,还有一个带有
ACDSubscriptionEvent
子类的基本
EventData

请注意(至少对于
XmlSerializer
),您可以省略许多名称空间,因为它们是从父级继承的。您可能比我更了解层次结构,因此某些属性可能可以移动到基类中等。理想情况下,您将拥有XML架构文件(.xsd),并能够使用
xsd.exe
生成类,但这将适用于给定的XML:

[XmlInclude(typeof(SubscriptionEvent))]
[XmlRoot(Namespace = "http://schema.broadsoft.com/xsi")]
public abstract class Event
{

}

[XmlType(Namespace = "http://schema.broadsoft.com/xsi")]
public class SubscriptionEvent : Event
{
    [XmlElement(ElementName = "eventID")]
    public string EventID { get; set; }

    [XmlElement(ElementName = "sequenceNumber")]
    public string SequenceNumber { get; set; }

    [XmlElement(ElementName = "userId")]
    public string UserId { get; set; }

    [XmlElement(ElementName = "externalApplicationId")]
    public string ExternalApplicationId { get; set; }

    [XmlElement(ElementName = "subscriptionId")]
    public string SubscriptionId { get; set; }

    [XmlElement(ElementName = "channelId")]
    public string ChannelId { get; set; }

    [XmlElement(ElementName = "targetId")]
    public string TargetId { get; set; }

    [XmlElement(ElementName = "eventData")]
    public EventData EventData { get; set; }
}

[XmlInclude(typeof(ACDSubscriptionEvent))]
public abstract class EventData
{

}

[XmlType(Namespace = "http://schema.broadsoft.com/xsi")]
public class ACDSubscriptionEvent : EventData
{

}

请参阅以获得一个工作演示(使用
XmlSerializer
)。

这解决了我的问题!我欠你一个巨大的感谢,尽管似乎还有另一个问题可能导致我头痛。我使用了XmlFormatters(因为它是WebAPI),恐怕它们不能使用改进的类进行反序列化。幸好你做了一把小提琴,这让我看到了过去的限制。我非常感谢你。
[XmlRoot(ElementName = "Event", Namespace = "http://schema.broadsoft.com/xsi")]
public class Event
{
    [XmlElement(ElementName = "eventID", Namespace = "http://schema.broadsoft.com/xsi")]
    public string EventID { get; set; }
    [XmlElement(ElementName = "sequenceNumber", Namespace = "http://schema.broadsoft.com/xsi")]
    public string SequenceNumber { get; set; }
    [XmlElement(ElementName = "userId", Namespace = "http://schema.broadsoft.com/xsi")]
    public string UserId { get; set; }
    [XmlElement(ElementName = "externalApplicationId", Namespace = "http://schema.broadsoft.com/xsi")]
    public string ExternalApplicationId { get; set; }
    [XmlElement(ElementName = "subscriptionId", Namespace = "http://schema.broadsoft.com/xsi")]
    public string SubscriptionId { get; set; }
    [XmlElement(ElementName = "channelId", Namespace = "http://schema.broadsoft.com/xsi")]
    public string ChannelId { get; set; }
    [XmlElement(ElementName = "targetId", Namespace = "http://schema.broadsoft.com/xsi")]
    public string TargetId { get; set; }
    [XmlElement(ElementName = "eventData", Namespace = "http://schema.broadsoft.com/xsi")]
    public EventData eventData { get; set; }


    [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string Type { get; set; }
    [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string xsi { get; set; }
    [XmlAttribute(AttributeName = "xsi1", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string Xsi1 { get; set; }

    [XmlRoot(ElementName = "eventData", Namespace = "http://schema.broadsoft.com/xsi")]
    public class EventData
    {
        [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
        public string Type { get; set; }
    }
}
[XmlInclude(typeof(SubscriptionEvent))]
[XmlRoot(Namespace = "http://schema.broadsoft.com/xsi")]
public abstract class Event
{

}

[XmlType(Namespace = "http://schema.broadsoft.com/xsi")]
public class SubscriptionEvent : Event
{
    [XmlElement(ElementName = "eventID")]
    public string EventID { get; set; }

    [XmlElement(ElementName = "sequenceNumber")]
    public string SequenceNumber { get; set; }

    [XmlElement(ElementName = "userId")]
    public string UserId { get; set; }

    [XmlElement(ElementName = "externalApplicationId")]
    public string ExternalApplicationId { get; set; }

    [XmlElement(ElementName = "subscriptionId")]
    public string SubscriptionId { get; set; }

    [XmlElement(ElementName = "channelId")]
    public string ChannelId { get; set; }

    [XmlElement(ElementName = "targetId")]
    public string TargetId { get; set; }

    [XmlElement(ElementName = "eventData")]
    public EventData EventData { get; set; }
}

[XmlInclude(typeof(ACDSubscriptionEvent))]
public abstract class EventData
{

}

[XmlType(Namespace = "http://schema.broadsoft.com/xsi")]
public class ACDSubscriptionEvent : EventData
{

}