3

我想customer.customer_info_id从以下响应中读取 的值。我的回复还包括命名空间:

<Field name="customer.customer_id" value="5403699387967341892"/>
<Field name="**customer.customer_info_id**" value="5403699387967341892"/>
<Field name="customer.customer_since_code" value="1985">
    <Lookup language="EN" value="1985"/>
    <Lookup language="FR" value="1985"/>
</Field>

我尝试了以下方法:

# Savon code tried:        

doc = Nokogiri::XML(response.to_xml)
doc.remove_namespaces!
val = doc.xpath("//Field:name" => "Customer.entity_id").to_s
puts "val is: #{val}"

它返回空值。

4

3 回答 3

2

我认为没有必要解析 XML 响应。萨文为你做这件事。您没有提供调用的代码,所以我认为它将是soap

client = Savon::Client.new do
  wsdl.document = <your url>
end

response = client.request :wsdl, :soap do
  <your parameters go here>
end

# pp response.to_hash

result = response.to_hash[:soap_response][:soap_result][:customer][:customer_info_id]

我经常pp response.to_hash用来了解返回的内容。

于 2012-06-27T16:04:55.797 回答
0

我和 Savon 的结果好坏参半。最终,我正在处理的 WSDL 返回一个StringWithAttributes需要解析的类,但在此之前它应该表现得像一个普通的哈希,这意味着你应该能够执行以下操作:

client = Savon::Client.new do
  wsdl.document = <your url>
end

response = client.request(:whatever_the_request_is_called) do
  soap.body = { <hash of your parameters> }
end

result = response[:soap_response][:soap_result][:customer][:customer_info_id]

如果您仍然得到空值,请在每个级别上尝试 a pp response[:soap_response].classor.keys以确保您仍在使用哈希。如果它变成了奇怪的StringwithAttributes类,你将不得不解析它。这似乎是在下降到许多层次之后发生的。在这种情况下,您可以执行以下操作:

needs_parsing = response.to_hash[:soap_response][:soap_result]

parsed = Nori.parse(needs_parsing)

然后你应该回到一个可导航的散列,你可以用.class.

于 2012-07-15T02:48:05.793 回答
0

下面使用 Nokogiri 的代码可以读取特定的 xml 元素值:

doc=Nokogiri.XML(File.open(File.dirname("your file name here"))

element=doc.at('element_name') #fetch the value of element needed.
于 2012-12-24T11:28:01.310 回答