我正在使用Microsoft ASP.NET Web API创建一个具有以下要求的服务:
要求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集合中的对象应反序列化为各自的类型:COLLATERALS
和LOANS
。此外,值为'xyz'的第一个抵押品不会被反序列化(因为类型为decimal
),但剩余的有效COLLATERAL
项将被反序列化。解析'xyz'到十进制的错误应以某种方式记录。
答案 0 :(得分:0)
您可以使用XML Schema(XSD文件)来定义XML文件的有效格式。现有的工具可以验证特定文件是否符合模式。
通过公开提供此架构,您将能够允许您的客户验证自己的请求,而无需实际与您的Web服务进行交互。它将允许他们查看他们的输入是否有效,如果他们需要对具体需要更改的内容进行复杂分析,他们就能够自行完成。