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

时间:2012-12-03 17:24:18

标签: c# xml deserialization

我正在使用Microsoft ASP.NET Web API创建一个具有以下要求的服务:

  1. 输入必须是XML(无json)
  2. XML将遵循标准(不能将自定义元素名称/属性添加到输入xml)
  3. 遇到反序列化中的异常(即格式错误的数据值)时,必须将它们记录为警告并且必须继续解析输入xml
  4. XML将包含元素所需的元素集合 反序列化为从基类型派生的类型
  5. 要求1和2只是定义我的输入。我开始使用内置的System.Xml.Serialization.XmlSerializer类开发我的解决方案,但不得不放弃它,因为它无法处理#3要求。

    或者,我发现YAXLib提供了非常useful way来处理要求#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#Classes

    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; }
    }
    

    预期输出

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

1 个答案:

答案 0 :(得分:0)

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

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