具有多态性和异常处理的XML反序列化

Mic*_*eck 5 c# xml deserialization

我使用Microsoft ASP.NET Web API创建服务,具有以下要求:

  1. 输入必须是XML(没有json)
  2. XML将遵循标准(不能将自定义元素名称/属性添加到输入xml)
  3. 当在反序列化中遇到异常时(即格式错误的数据值),必须将它们记录为警告并且必须继续解析输入xml
  4. 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>
Run Code Online (Sandbox Code Playgroud)

由于要求#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>
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

预期产出

DEALS应该将类的Items集合中的对象反序列化为它们各自的类型:COLLATERALSLOANS.此外,值为'xyz'的第一个抵押品将不会反序列化(因为类型为decimal),但其余有效COLLATERAL项将被反序列化.解析'xyz'到十进制的错误应该以某种方式记录.

Ser*_*rvy 0

您可以使用 XML 架构(XSD 文件)来定义 XML 文件的有效格式。现有的工具可以验证特定文件是否符合架构。

通过公开提供此架构,您将能够允许您的客户验证他们自己的请求,而无需实际与您的 Web 服务交互。它将允许他们查看他们的输入是否有效,并且如果他们需要对具体需要更改的内容进行复杂的分析以符合要求,他们将能够自行完成。