c# - 使用 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 。
我认为这是关于命名空间声明,但任何帮助将不胜感激!
解决方案
<View xsi:type="Worksheet">
这意味着真正的类型View
是Worksheet
类型。
创建基类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
{
...
}
推荐阅读
- google-app-engine - 谷歌云任务队列消耗太慢
- python - python数据库将+1添加到列
- reactjs - 在 react 中显示从 web api 获得的图像
- android - 如何捕捉我所在的页面编号?ViewPager 反应原生
- redirect - 没有 HSTS 标头失败
- python - 两种方式表或数据框的不同值分配
- python - 在 O(1) 时间内从 python3 dict 中检索任意键
- r - 如何根据三个不同变量的三个条件在df中选择一个值?
- java - 程序启动时清除java swing表单的所有文本字段
- apache-kafka - 在 Kafka 中轮询消费者组滞后于 HTTP