C# XML反序列化无法解析属性类型
我正在从事一个项目,在这个项目中,我通过REST和Comet语义与API服务进行通信 XML 所以,问题就在眼前。 我在尝试反序列化以下XML时收到此错误 解析类型“xsi:SubscriptionEvent”时出错 NetBike.Xml.TypeResolvers.XmlTypeResolveException 注意:我使用NetBike,但默认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
<?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,有些则不会
- :失败
- :失败
- :好的
有点沮丧的开发人员迫切需要帮助。我认为出现这种混乱是因为
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
{
}