Поиск ответа savon, поскольку документ nokogiri возвращает пустой массив - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь разобрать ответ Савона как документ nokokiri

c = Savon.client(wsdl: 'http://test.fedresurs.ru/MessageService/WebService.svc?wsdl', digest_auth: ['demowebuser', 'Ax!761BN'], namespace: "http://tempuri.org/", namespace_identifier: :tem, log: true)
r = c.call(:get_trade_messages, message: {'tem:startFrom' => DateTime.now-1})
r.doc.search("TradePlace")

, и он возвращает пустой массив.

Что я делаю неправильно?Может быть, я должен как-то иметь дело с пространствами имен?Но как?.Примеры, которые я нашел в документации по nokogiri, используют Xpath, а не search.И даже с Xpath он возвращает пустой массив.

XML-ответ:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <GetTradeMessagesResponse xmlns="http://tempuri.org/">
         <GetTradeMessagesResult>
            <TradePlace INN="7606055642" Name="Первая электронная площадка " Site="1torgi.ru " OwnerName="ООО &quot;Промтех&quot;">
               <TradeList>
                  <Trade ID_External="ЗКОФЦП-17136" ID_EFRSB="653476">
                     <MessageList>
                        <TradeMessage ID="4851134"/>
                        <TradeMessage ID="4851135"/>
                     </MessageList>
                  </Trade>
               </TradeList>
            </TradePlace>
         </GetTradeMessagesResult>
      </GetTradeMessagesResponse>
   </s:Body>
</s:Envelope>

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Как я и ожидал, ответ был в пространстве имен, код ниже работает нормально:

r.doc.search("a|TradePlace", {"a" => "http://tempuri.org/"})
0 голосов
/ 19 октября 2018

Вы можете использовать Nokogiri, чтобы разбить XML-ответ.Пример (теперь нефункциональный) таков:

doc = Nokogiri::XML(response.to_hash[:get_quote_response][:get_quote_result])
print doc.to_xml(indent: 2)

print "Date      : ", doc.at_css("Date").text, "\n"
print "Last price: ", doc.at_css("Last").text

- более полный пример в моей папке https://pastebin.com/W0RUuaHU. WebserviceX, к сожалению, прекращен.

...