c# - 使用结构数组的 Xml-RPC.Net 响应映射

标签 c# xml-rpc

我正在尝试使用第三方提供的几个不同的 XML-RPC API 服务。我正在使用库克计算的 xml-rpc.net 库:http://xml-rpc.net/
TLDR
我需要帮助映射 数组 从 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>
大批
数组响应是它变得非常棘手的地方。对于这些类型的响应,我无法获得任何可靠的工作。
我已经尝试像结构响应一样向对象数组添加一个额外的维度,但随后我只剩下 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>
任何关于如何简单而正确地映射这些类型的响应的指针将不胜感激。
谢谢,
詹姆士。

最佳答案

XML-RPC.NET 目前不支持将数组映射到类或结构类型,尽管原则上没有任何东西可以阻止这种情况(即,您可以使用新版本的XmlRpcMember 属性并修改序列化器/反序列化器)。但是现在你必须做一些类似于你建议的事情,尽管我认为你的数组维度错了,类型应该像这样定义:
状态消息

public class StatusResponse
{
  public Result[] Result;
  public int TransactionID;
}

public struct Result
{
  public string Status;
}
结构
public struct StructureResponse
{
  public object[][] Result;
}
大批
public struct ArrayResponse
{
  public object[][][] Result;
}

关于c# - 使用结构数组的 Xml-RPC.Net 响应映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945863/

相关文章:

c# - 如何在 ASP.NET 中上传图像文件而不进行任何回发

c# - 是否有一种更易读的方式来制作一长串 && 语句?

java - 使用 Java 发送 XMLRPC 请求

c - 编译xmlrpc-c程序的问题

java - 异常: Method not found: execute_kw

c# - 找不到类型或命名空间名称 'HttpResponseMessage'

c# - 如何让 PrettyBin 不将 PDB 文件复制到 lib 文件夹以显示异常行号?

c# - 如何在不将整个文档加载到内存的情况下处理 Xml 文件?

java - Java 程序与非 JDK 对象之间的通信

python - 在没有新模块的情况下向 OpenERP 中的合作伙伴添加外部 ID