【发布时间】:2012-03-30 15:20:30
【问题描述】:
我正在尝试使用第三方提供的几个不同的 XML-RPC API 服务。我正在使用 Cook Computing 的 xml-rpc.net 库:http://xml-rpc.net/
TLDR
我需要帮助将 Array 响应类型从 XML-RPC API 实现映射到强类型 C# 对象。
说明
正在使用 xml-rpc 规范的 2 种不同实现,每种实现一种。一种是使用相当容易使用的实现,使用具有良好逻辑结构的 StructParams。
另一个……没那么多。
我已经设法可靠地传递请求,问题来自响应。有 3 种不同的响应类型:
状态信息
这个响应并不太难处理,它包含一个带有嵌套结构和一个 int 的结构,可以映射到类似的东西:
public class Response
{
public Result[] Result;
public int Status;
}
public struct Result
{
public string Status;
}
可以如上映射的响应中的XML是:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>Result</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>Status</name>
<value>Everything is OK</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</member>
<member>
<name>TransactionID</name>
<value><i4>123</i4></value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
结构
这给了我一个小问题,但我已经能够通过一些讨厌的扩展方法来克服它,但我对此并不满意。它与上面类似,但结果现在是一个值数组的数组,我只能将其可视化为 object[][][],所以我将其映射到:
public struct Response
{
public object[][][] Result;
}
由此,我可以使用我的扩展方法,该方法使用反射将最终数组中的各个对象映射到具有正确类型的特定结构。
我希望有人能想出一个更好的方法来做到这一点。这是我要映射的响应 XML:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>Result</name>
<value>
<array>
<data>
<value>
<array>
<data>
<value><i4>1</i4></value>
<value>second slot (string)</value>
<value><double>1.23</double></value>
<value><i4>1</i4></value>
<value>Another string slot</value>
</data>
</array>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
数组
数组响应是真正棘手的地方。对于这些类型的响应,我无法让任何东西可靠地工作。
我已经尝试向对象数组添加一个额外的维度,就像 struct 响应一样,但是我留下了 object[][][][],然后我必须抓住最后的 2 个维度,遍历它们并将它们映射到特定结构的数组。我真的希望有一种我在这里缺少的替代方法。
以下是此类响应的示例 XML:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>Result</name>
<value>
<array>
<data>
<value>
<array>
<data>
<value>
<array>
<data>
<value>
<i4>1</i4>
</value>
<value>Disk Space</value>
<value>MB</value>
<value>
<i4>200</i4>
</value>
<value>
<double>0.000000</double>
</value>
<value>
<i4>0</i4>
</value>
</data>
</array>
</value>
<value>
<array>
<data>
<value>
<i4>2</i4>
</value>
<value>Traffic</value>
<value>GB</value>
<value>
<i4>20</i4>
</value>
<value>
<double>1.000000</double>
</value>
<value>
<i4>0</i4>
</value>
</data>
</array>
</value>
</data>
</array>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
任何关于如何简单而正确地映射这些类型的响应的指针将不胜感激。
谢谢, 詹姆斯。
【问题讨论】: