5

次の要件を持つMicrosoftASP.NETWebAPIを使用してサービスを作成しています。

  1. 入力はXMLである必要があります(jsonなし)
  2. XMLは標準に従います(入力xmlにカスタム要素名/属性を追加することはできません)
  3. デシリアライズで例外(つまり、データ値の形式が正しくない)が発生した場合は、警告としてログに記録し、入力xmlの解析を続行する必要があります。
  4. XMLには要素のコレクションが含まれ、要素は基本型から派生した型に逆シリアル化する必要があります

要件1と2は、単に私の入力を定義するだけです。組み込みクラスを使用してソリューションの開発を開始しましたSystem.Xml.Serialization.XmlSerializerが、要件#3を処理できなかったため、ソリューションを放棄する必要がありました。

あるいは、要件#3を処理するための非常に便利な方法を提供するYAXLibを見つけました。

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'を10進数に解析するエラーは、なんらかの方法でログに記録する必要があります。

4

1 に答える 1

0

XMLスキーマ(XSDファイル)を使用して、XMLファイルの有効な形式を定義できます。特定のファイルがスキーマに準拠しているかどうかを検証する既存のツールがあります。

このスキーマを公開することで、クライアントが実際にWebサービスと対話することなく自分の要求を検証できるようになります。これにより、入力が有効かどうかを確認でき、準拠するために具体的に何を変更する必要があるかについて複雑な分析を実行する必要がある場合は、自分でそれを実行できます。

于 2012-12-04T20:09:14.710 に答える