2009-09-05 2 views
0

Одна вещь, которую я заметил со всеми примерами XML-RPC, включая саму спецификацию, - нет подробного примера схемы с использованием рекурсивных (param) значений , Трудно понять, что на самом деле возможно в XML-RPC без этих иллюстраций, и мне интересно, может ли кто-нибудь помочь мне лучше справиться с этим.Понимание возможностей параметра XML-RPC, особенно рекурсии значений

Спецификация говорит:

< структура > ы могут быть рекурсивными, любой < значение > может содержать <-структуру > или любой другой тип , включающий в себя массив < >, , описанной ниже.

< массивы > с могут быть рекурсивными, любое значение может содержать массив < > или любой другой тип , в том числе < структуры >, описанной выше.

ли это, что означает, что это совершенно законно, чтобы сделать следующее:

<?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> 

Я пытаюсь написать реализацию и я нужно знать все возможности и что проверять при прохождении через чью-то схему на стороне сервера. С учетом того, как spec читает, кажется, что вы можете вложить массивы и структуры взаимозаменяемо, но я хотел проверить, что это правда. Благодаря!

ответ

1

Абсолютно. Я поддерживаю реализацию XML-RPC в Perl и обрабатываю произвольное вложение данных (это больше относится к , вложенному, чем рекурсии) было довольно просто.

Как вы упомянули, что вы работаете над своей собственной реализацией (хотя вам действительно нужно посмотреть, есть ли у вашего языка уже реализация - было бы лучше внести вклад в текущую разработку и обслуживание установленного проекта), есть одна недавняя проблема, с которой я столкнулся, и фактическая, настоящая рекурсия, которую вы, возможно, захотите учесть: Предполагая, что ваш язык поддерживает ссылки, будьте осторожны, чтобы у вас не было циклических ссылок в ваших структурах данных. Я только что выпустил новую версию моей реализации Perl (http://search.cpan.org/dist/RPC-XML), которая исправляет ошибку с бесконечной рекурсией, когда массив или структура содержит циклические ссылки.

1

Да, я не понимаю, почему нет. Я следил за разработкой протокола Dave Winer 10 в то время и также разработал и внедрил решение для кластерного вычисления (поиск в базе данных молекулярной последовательности), в котором использовался протокол связи XML-RPC для связи. Он не использовал сложные структуры , но, например, элемент в массиве может быть любым из 3 (примитив, массив, структура).