将 savon 响应搜索为 nokogiri 文档 returns 一个空数组
Searching savon response as nokogiri document returns an empty array
我尝试将 savon 的响应解析为 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")
它 returns 一个空数组。
我做错了什么?也许我应该以某种方式处理名称空间?但是,如何?我在 nokogiri 文档中找到的示例使用 Xpath,而不是搜索。即使使用 Xpath,它 returns 也是一个空数组。
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="ООО "Промтех"">
<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>
您可以使用 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
我的 pastebin https://pastebin.com/W0RUuaHU 中有更完整的示例。不幸的是,WebserviceX 已停产。
正如我所料,答案在命名空间中,下面的代码工作正常:
r.doc.search("a|TradePlace", {"a" => "http://tempuri.org/"})
我尝试将 savon 的响应解析为 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")
它 returns 一个空数组。
我做错了什么?也许我应该以某种方式处理名称空间?但是,如何?我在 nokogiri 文档中找到的示例使用 Xpath,而不是搜索。即使使用 Xpath,它 returns 也是一个空数组。
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="ООО "Промтех"">
<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>
您可以使用 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
我的 pastebin https://pastebin.com/W0RUuaHU 中有更完整的示例。不幸的是,WebserviceX 已停产。
正如我所料,答案在命名空间中,下面的代码工作正常:
r.doc.search("a|TradePlace", {"a" => "http://tempuri.org/"})