次の要件を持つMicrosoftASP.NETWebAPIを使用してサービスを作成しています。
- 入力はXMLである必要があります(jsonなし)
- XMLは標準に従います(入力xmlにカスタム要素名/属性を追加することはできません)
- デシリアライズで例外(つまり、データ値の形式が正しくない)が発生した場合は、警告としてログに記録し、入力xmlの解析を続行する必要があります。
- 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進数に解析するエラーは、なんらかの方法でログに記録する必要があります。