2012-06-27 4 views
2

Я хочу прочитать значение customer.customer_info_id из следующего ответа. Мой ответ также включает в себя пространство имен:Как читать значение из ответа Savon?

<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}" 

возвращает нулевое значение.

+0

, где это код/​​исключение? –

+0

<Имя поля = "customer.customer_id" value = "5403699387967341892" /><Имя поля = "customer.customer_info_id" value = "5403699387967341892" /><Имя поля = "customer.customer_since_code" value = "1985"><Поиск language = "EN" value = "1985" /> Я пробовал следующее: reader = Nokogiri :: XML :: Reader (response.to_xml) val = reader.attribute ("customer.customer_id") puts "val is # {val}" Это дает мне значение nil – Suriya

+0

Какое значение вы хотите прочитать? Где ваш код Ruby? Обычно вы кодируете что-то вроде result.to_hash [: key] [: another_key] –

ответ

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. 
2

Я не думаю, что необходимо проанализировать ответ XML. Савон делает это за вас. Вы не указали код для звонка Предполагаю, будет мыло.

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, чтобы получить представление о том, что возвращается.

+0

hi приведенный ниже код разработан для чтения конкретному значению элемента xml: – Suriya

0

У меня были смешанные результаты с Савоном. В конце концов 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] 

Если вы все еще получаете нулевые значения, попробуйте pp response[:soap_response].class или .keys на каждом уровне, чтобы убедиться, что вы все еще работаете с хэшем. Если это станет странным классом StringwithAttributes, вам придется его разобрать. Это, похоже, происходит после перехода на многие уровни. В этом случае вы можете сделать что-то вроде этого:

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

parsed = Nori.parse(needs_parsing) 

Тогда вы должны быть обратно в судоходном хэш, который вы можете проверить с .class.