5

我正在使用具有以下要求的 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>

由于要求 #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应反序列化为它们各自的类型:COLLATERALSLOANS. 此外,值为“xyz”的第一个抵押品不会被反序列化(因为类型为decimal),但剩余的有效COLLATERAL项目将被反序列化。应该以某种方式记录将“xyz”解析为十进制的错误。

4

1 回答 1

0

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

通过公开提供此模式,您将能够允许您的客户验证他们自己的请求,而无需实际与您的 Web 服务交互。这将使他们能够查看他们的输入是否有效,以及他们是否需要对具体需要更改的内容进行复杂的分析以符合他们将能够自己做到这一点。

于 2012-12-04T20:09:14.710 回答