首页 > 解决方案 > 使用 xsi:type 反序列化 XML

问题描述

<?xml version="1.0" encoding="utf-16"?>
<Payload DataType="Tax" DataFormat="Standard" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <TaxReturn>
        <ReturnHeader ClientID="ABC" TaxYear="2017" ReturnType="F" ReturnGroupName="Default" Country="US" OfficeName="Dev" BusinessUnitName="Returns" ConfigurationSet="Default" ReturnVersion="1" EINorSSN="" ControlNumber="202011170947577107"/>
        <TaxPayerDetails NameLine1="CCC" NameLine2=""/>
        <View xsi:type="Worksheet">
            <Identifier Hierarchy="Federal\General\Basic Data"/>
            <Controls>
                <Entity ID="1"/>
            </Controls>
            <WorkSheetSection Name="General">
                <FieldData Location="Entity Type" LocationType="Description" Value="Simple"/>
                <FieldData Location="Entity Name Line 1" LocationType="Description" Value="test"/>
            </WorkSheetSection>
            <WorkSheetSection Name="Other Information"/>
            <WorkSheetSection Name="Direct Deposit / Electronic Funds Withdrawal"/>
        </View>
    </TaxReturn>
</Payload>

以上是我的xml。

这是我的 c# 对象

[XmlRoot(ElementName = "TaxReturn")]
    public class TaxReturn
    {
        [XmlElement(ElementName = "ReturnHeader")]
        public ReturnHeader ReturnHeader { get; set; }
        [XmlElement(ElementName = "TaxPayerDetails")]
        public TaxPayerDetails TaxPayerDetails { get; set; }
        [XmlElement(ElementName = "View", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
        public View View { get; set; }
    }

[XmlRoot(ElementName = "View")]
    public class View
    {
        [XmlAttribute(AttributeName = "type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
        public string Type { get; set; }
        [XmlElement(ElementName = "Identifier")]
        public Identifier Identifier { get; set; }
        [XmlElement(ElementName = "Controls")]
        public Controls Controls { get; set; }
        [XmlElement(ElementName = "WorkSheetSection")]
        public WorkSheetSection[] WorkSheetSection { get; set; }   
    }

当我尝试获取 View 对象时 - 当我反序列化它时,我得到了 null 。

我认为这是关于命名空间声明,但任何帮助将不胜感激!

标签: c#xml

解决方案


<View xsi:type="Worksheet">这意味着真正的类型ViewWorksheet类型。

创建基类View。继承Worksheet它的类。

使用XmlInclude属性指定有效类型。

[XmlRoot(ElementName = "TaxReturn")]
public class TaxReturn
{
    ...

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

[XmlInclude(typeof(Worksheet))]
public class View { }

[XmlRoot(ElementName = "View")]
public class Worksheet : View
{
    ...
}

推荐阅读