0

在所有 XML-RPC 示例(包括规范本身)中,我注意到的一件事是没有使用递归(参数)值的模式的详细示例。如果没有这些插图,很难理解在 XML-RPC 中实际上应该有什么可能,我想知道是否有人可以帮助我更好地处理它。

规范说:

<struct> 可以是递归的,任何 <value> 都可以包含 <struct> 或任何其他类型,包括 <array>,如下所述。

<arrays> 可以是递归的,任何值都可以包含 <array> 或任何其他类型,包括上述的 <struct>。

这是否意味着执行以下操作是完全合法的:

<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value>
                <struct>
                    <member>
                        <name>lowerBound</name>
                        <value>
                            <struct>
                                <member>
                                    <name>lowerBound</name>
                                    <value><i4>18</i4></value>
                                </member>
                                <member>
                                    <name>upperBound</name>
                                    <value><i4>139</i4></value>
                                </member>
                            </struct>
                        </value>
                    </member>
                    <member>
                        <name>upperBound</name>
                        <value><i4>139</i4></value>
                    </member>
                </struct>
            </value>
        </param>
    </params>
</methodCall>

是否也可以这样做:

<?xml version="1.0"?>
<methodCall>
    <methodName>examples.getStateName</methodName>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value><i4>12</i4></value>
                        <value>
                            <struct>
                                <member>
                                    <name>lowerBound</name>
                                    <value>
                                        <struct>
                                            <member>
                                                <name>lowerBound</name>
                                                <value><i4>18</i4></value>
                                            </member>
                                            <member>
                                                <name>upperBound</name>
                                                <value><i4>139</i4></value>
                                            </member>
                                        </struct>
                                    </value>
                                </member>
                                <member>
                                    <name>upperBound</name>
                                    <value><i4>139</i4></value>
                                </member>
                            </struct>
                        </value>
                        <value><boolean>0</boolean></value>
                        <value><i4>-31</i4></value>
                    </data>
                </array>
            </value>
        </param>
    </params>
</methodCall>

我正在尝试编写一个实现,我需要知道所有的可能性,以及在服务器端遍历某人的模式时要检查的内容。根据规范的读取方式,您似乎可以互换嵌套数组和结构,但我想验证这是真的。谢谢!

4

2 回答 2

1

是的,我不明白为什么不。我当时跟随 Dave Winer 的协议开发,也设计并实现了一个集群计算解决方案(在分子序列数据库中搜索),使用 XML-RPC 协议进行通信。它没有使用复杂的结构,但例如,数组中的项目可以是 3 种(原始、数组、结构)中的任何一种。

于 2009-09-05T14:35:10.560 回答
1

绝对地。我维护了一个 XML-RPC 的 Perl 实现,并且处理数据的任意嵌套(这更多的是嵌套而不是递归)相当简单。

正如您提到的,您正在开发自己的实现(尽管您真的应该看看您的语言是否已经有了实现——最好为已建立项目的持续开发和维护做出贡献),有我最近遇到的一个关于嵌套和实际的、真实的递归的问题,您可能要记住:假设您的语言支持引用,请注意您的数据结构中没有任何循环引用。我刚刚发布了我的 Perl 实现的新版本 ( http://search.cpan.org/dist/RPC-XML ),它修复了当数组或结构包含循环引用时的无限递归错误。

于 2009-09-05T20:17:47.223 回答