我正在使用具有以下要求的 Microsoft ASP.NET Web API 创建服务:
- 输入必须是 XML(无 json)
- XML 将遵循标准(不能将自定义元素名称/属性添加到输入 xml)
- 在反序列化中遇到异常(即数据值格式错误)时,必须将它们记录为警告,并且必须继续解析输入 xml
- XML 将包含元素的集合,其中的元素需要反序列化为从基本类型派生的类型
要求 1 和 2 只是定义了我的输入。我开始使用内置System.Xml.Serialization.XmlSerializer
类来开发我的解决方案,但不得不放弃它,因为它无法处理需求 #3。
或者,我发现YAXLib提供了一种非常有用的方法来处理需求 #3。
YAXLib 也处理需求 #4,但仅通过使用 XML 中的自定义属性:
<ListOfObjects>
<Object yaxlib:realtype="System.Int32">7</Object>
<Object yaxlib:realtype="System.Double">3.14</Object>
<Object yaxlib:realtype="System.String">Congrats</Object>
<Object yaxlib:realtype="System.StringSplitOptions">RemoveEmptyEntries</Object>
</ListOfObjects>
由于要求 #2,我不能使用这种方法。我需要类似的东西,System.Xml.Serialization.XmlElementAttribute
所以我可以在代码中指示序列化程序,而不是在数据中。是否有现有的解决方案可以处理所有这些要求?
例子:
输入
<DEALS>
<DEAL>
<COLLATERALS>
<COLLATERAL>xyz</COLLATERAL>
<COLLATERAL>1.2</COLLATERAL>
<COLLATERAL>4.5</COLLATERAL>
</COLLATERALS>
<LOANS>
<LOAN>
<CLOSING_INFORMATION />
</LOAN>
</LOANS>
</DEAL>
</DEALS>
C# 类
public class DEAL
{
[System.Xml.Serialization.XmlElementAttribute("COLLATERALS", typeof(COLLATERALS))]
[System.Xml.Serialization.XmlElementAttribute("LOANS", typeof(LOANS))]
[YAXCollection(YAXCollectionSerializationTypes.RecursiveWithNoContainingElement)]
public object[] Items
{
get
{
return this.itemsField;
}
set
{
this.itemsField = value;
}
}
// Remaining implementation details omitted..
}
public class COLLATERALS { /* details omitted.. */ }
public class LOANS { /* details omitted.. */ }
public class COLLATERAL
{
[System.Xml.Serialization.XmlTextAttribute()]
public decimal Value { get; set; }
}
预期产出
类的 Items 集合中的对象DEALS
应反序列化为它们各自的类型:COLLATERALS
和LOANS
. 此外,值为“xyz”的第一个抵押品不会被反序列化(因为类型为decimal
),但剩余的有效COLLATERAL
项目将被反序列化。应该以某种方式记录将“xyz”解析为十进制的错误。