【问题标题】:How can I extract/parse from this SOAP envelope using Ruby?如何使用 Ruby 从这个 SOAP 信封中提取/解析?
【发布时间】:2010-08-11 17:19:25
【问题描述】:

我正在使用一个使用 soap/wsdlDriver 的 gem。

当我发布时,我收到了一个 SOAP 响应,但无法轻松解析它。

这是我得到的回复:

#<SOAP::Mapping::Object:0x159e95faf098 {}id="27b907f8-da51-f611-ab02-4c5f88a8ec8
8" {}error=#<SOAP::Mapping::Object:0x159e95fae33c {}number="0" {}name="No Error"
 {}description="No Error">>

我需要获取 id="xxxx" 中的全部值

这就是 heroku 上的内容(注意:它在本地工作)。这来自测试 response.id 的各种变体(其中 response.inspect 是创建上述输出的原因)

f" {}错误=#> 响应[id] /disk1/home/slugs/220752_47a08bb_10e7/mnt/app/controllers/sugarcrm_controller.rb :77: 警告:Object#id 将是 已弃用;使用 Object#object_id 无 response.id: /disk1/home/slugs/220752_47a08bb_10e7/mnt/app/controllers/sugarcrm_controller.rb :79: 警告:Object#id 将是 已弃用;使用对象#object_id 23891500658740 /disk1/home/slugs/220752_47a08bb_10e7/mnt/app/controllers/sugarcrm_controller.rb :80: 警告:Object#id 将是 已弃用;使用 Object#object_id 这个 是contact_id:23891500658740 事件:

【问题讨论】:

  • 这是实际的服务器响应吗?还是某个对象的inspect 值?因为它看起来像是 SOAP::Mapping::Object 类的 ruby​​ 实例。如果是这样,我敢打赌它有某种 API 可以访问这些数据。 object.attributes[:id] 之类的。
  • 嗯...我需要检查一下我不记得了。现在看代码....我怎样才能知道如何访问数据?我尝试了 response.id,但它不起作用(其中 response = SOAP CALL)
  • 是的,你是对的,它是一个.inspect

标签: ruby regex soap


【解决方案1】:

好的,我 95% 确定这是 SOAP::Mapping::Object#inspect 的输出,而不是实际响应。从那个类看起来你使用[] 方法来提取属性。

所以如果我没看错,那么看起来你可能想要:

response_id = response_object['id']

虽然每个属性都以{} 开头似乎很奇怪。因此,如果这实际上是属性名称的一部分,您可能需要:

response_id = response_object['{}id']

但这看起来很奇怪,可能表明您使用的 SOAP 库没有正确解析响应。

免责声明:我以前从未使用过这个库,只是通过阅读文档发布了这个......这在描述使用此类的方式上可能非常准确,也可能不太准确。

【讨论】:

  • 是的,这就是我所希望的......但是当我这样做时,我得到的是一个不同的字符串。它在本地工作,但是当我使用 heroku 而不是字母数字字符串时,我得到的只是一串数字,这是不正确的......想法?
  • 这是我在 heroku 和 local 上得到的输出: Object#id will be deprecated;使用 Object#object_id 也许这会有所启发?
  • 可能是不同版本的 ruby​​ 或 SOAP 库导致它以两种不同的方式运行。
  • 您好,我该如何检查——我相信我们都在使用 ruby​​ 1.8.7...啊,等等,另一个应用程序仍在旧版本上...啊,是的,就是这样
  • 我刚刚在新的 heroku 堆栈上检查了它——仍然收到错误:(
【解决方案2】:

我不知道如何用 ruby​​ 做到这一点,但可能就像 javascript 中的这段代码。

var t = "<SOAP message........>";
var id = t.replace(/.*id=\"(.*?)\".*/, "$1");

正则表达式详细信息:

.*id=\"(.*?)\".*

.* = anything, 0 or N times.
(.*?) = anything, 0 or N times, stopping at first match.
$1 = first group, the content inside ().

所以,一切都将被 id 内容取代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多