0

Im using savon gem to fetch xml information.

The xml response is like this

"<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"><S:Body><Divisions xmlns=\"urn:description7a.services.chrome.com\"><responseStatus responseCode=\"Successful\" description=\"Successful\"/><division id=\"1\">Acura</division><division id=\"44\">Aston Martin</division><division id=\"4\">Audi</division><division id=\"45\">Bentley</division><division id=\"5\">BMW</division><division id=\"6\">Buick</division><division id=\"7\">Cadillac</division><division id=\"8\">Chevrolet</division><division id=\"9\">Chrysler</division><division id=\"11\">Dodge</division><division id=\"46\">Ferrari</division><division id=\"59\">FIAT</division><division id=\"13\">Ford</division><division id=\"15\">GMC</division><division id=\"16\">Honda</division><division id=\"17\">Hyundai</division><division id=\"18\">Infiniti</division><division id=\"19\">Isuzu</division><division id=\"20\">Jaguar</division><division id=\"21\">Jeep</division><division id=\"22\">Kia</division><division id=\"47\">Lamborghini</division><division id=\"23\">Land Rover</division><division id=\"24\">Lexus</division><division id=\"25\">Lincoln</division><division id=\"48\">Lotus</division><division id=\"53\">Maserati</division><division id=\"26\">Mazda</division><division id=\"27\">Mercedes-Benz</division><division id=\"2\">MINI</division><division id=\"29\">Mitsubishi</division><division id=\"30\">Nissan</division><division id=\"34\">Porsche</division><division id=\"57\">Ram</division><division id=\"49\">Rolls-Royce</division><division id=\"52\">Scion</division><division id=\"42\">Smart</division><division id=\"37\">Subaru</division><division id=\"38\">Suzuki</division><division id=\"56\">Tesla</division><division id=\"39\">Toyota</division><division id=\"40\">Volkswagen</division><division id=\"41\">Volvo</division></Divisions></S:Body></S:Envelope>"

i want to split the id and make name.

how can i do it

Edited

i have saved xml in a variable like

  xml = 1.9.3p194 :063 > xml
 => "<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"><S:Body><Divisions xmlns=\"urn:description7a.services.chrome.com\"><responseStatus responseCode=\"Successful\" description=\"Successful\"/><division id=\"1\">Acura</division><division id=\"44\">Aston Martin</division><division id=\"4\">Audi</division><division id=\"45\">Bentley</division><division id=\"5\">BMW</division><division id=\"6\">Buick</division><division id=\"7\">Cadillac</division><division id=\"8\">Chevrolet</division><division id=\"9\">Chrysler</division><division id=\"11\">Dodge</division><division id=\"46\">Ferrari</division><division id=\"59\">FIAT</division><division id=\"13\">Ford</division><division id=\"15\">GMC</division><division id=\"16\">Honda</division><division id=\"17\">Hyundai</division><division id=\"18\">Infiniti</division><division id=\"19\">Isuzu</division><division id=\"20\">Jaguar</division><division id=\"21\">Jeep</division><division id=\"22\">Kia</division><division id=\"47\">Lamborghini</division><division id=\"23\">Land Rover</division><division id=\"24\">Lexus</division><division id=\"25\">Lincoln</division><division id=\"48\">Lotus</division><division id=\"53\">Maserati</division><division id=\"26\">Mazda</division><division id=\"27\">Mercedes-Benz</division><division id=\"2\">MINI</division><division id=\"29\">Mitsubishi</division><division id=\"30\">Nissan</division><division id=\"34\">Porsche</division><division id=\"57\">Ram</division><division id=\"49\">Rolls-Royce</division><division id=\"52\">Scion</division><division id=\"42\">Smart</division><division id=\"37\">Subaru</division><division id=\"38\">Suzuki</division><division id=\"56\">Tesla</division><division id=\"39\">Toyota</division><division id=\"40\">Volkswagen</division><division id=\"41\">Volvo</division></Divisions></S:Body></S:Envelope>" 

and i tried

 @doc = Nokogiri::XML(xml)

it gave something like

#<Nokogiri::XML::Document:0x5ea65f0 name="document" children=[#<Nokogiri::XML::Element:0x5ea6398 name="Envelope" namespace=#<Nokogiri::XML::Namespace:0x5ea6370 prefix="S" href="http://schemas.xmlsoap.org/soap/envelope/"> children=[#<Nokogiri::XML::Element:0x5ea5fc4 name="Body" namespace=#<Nokogiri::XML::Namespace:0x5ea6370 prefix="S" href="http://schemas.xmlsoap.org/soap/envelope/"> children=[#<Nokogiri::XML::Element:0x5ea5c5e name="Divisions" namespace=#<Nokogiri::XML::Namespace:0x5ea5c18 href="urn:description7a.services.chrome.com"> children=[#<Nokogiri::XML::Element:0x5ea592a name="responseStatus" namespace=#<Nokogiri::XML::Namespace:0x5ea5c18 href="urn:description7a.services.chrome.com"> attributes=[#<Nokogiri::XML::Attr:0x5ea5858 name="responseCode" value="Successful">, #<Nokogiri::XML::Attr:0x5ea581c name="description" value="Successful">]>, #<Nokogiri::XML::Element:0x5ea518c name="division" namespace=#<Nokogiri::XML::Namespace:0x5ea5c18 href="urn:description7a.services.chrome.com"> attributes=[#<Nokogiri::XML::Attr:0x5ea515a name="id" value="1">] children=[#<Nokogiri::XML::Text:0x5ea4ad4 "Acura">]>, #<Nokogiri::XML::Element:0x5ea491c name="division" namespace=#<Nokogiri::XML::Namespace:0x5ea5c18 href="urn:description7a.services.chrome.com"> attributes=[#<Nokogiri::XML::Attr:0x5ea489a name="id" value="44">] children=[#<Nokogiri::XML::Text:0x63dc434 "Aston Martin">]>, #<Nokogiri::XML::Element:0x63dc222 name="division" namespace=#<Nokogiri::XML::Namespace:0x5ea5c18 href="urn:description7a.services.chrome.com"> attributes=[#<Nokogiri::XML::Attr:0x63dc1f0 name="id" value="4">] children=[#<Nokogiri::XML::Text:0x63dbcbe "Audi">]>, #<Nokogiri::XML::Element:0x63dbb56 name="division" namespace=#<Nokogiri::XML::Namespace:0x5ea5c18 href="urn:description7a.services.chrome.com"> attributes=[#<Nokogiri::XML::Attr:0x63dbb10 name="id" value="45">] ......

i tried @doc.xpath('//S:Envelope//S::Body').each do |f| puts f end

I get out put like

<S:Body>
  <Divisions xmlns="urn:description7a.services.chrome.com">
  <responseStatus responseCode="Successful" description="Successful"/>
    <division id="1">Acura</division>
    <division id="44">Aston Martin</division>
    <division id="4">Audi</division>
    <division id="45">Bentley</division>
    <division id="5">BMW</division>
    .......
  </Divisions>
</S:Body>

i want to retrieve info like id and the name so i tried

it returned [], empty array

 @doc.xpath('//S:Envelope//S::Body//Divisions')

it returned empty array like []

Anbazhagan p
  • 943
  • 1
  • 14
  • 27
  • Possible duplicate of: http://stackoverflow.com/questions/9482047/read-response-with-nokogiri-from-a-soap-call-with-savon – vee Nov 30 '13 at 19:06

2 Answers2

0

I beleive you should look at Nokogiri and XPAth. XPath is very powerful tool when you work with XML. Here you can find an example of using Nokogiri + XPath. You should read documentation about xpath (borrowed from previous link :) ). Of course you can found ton of other examples in google.

PS IMHO XPath is powerful but with interesting logic (concept) and I doubt that you will get good result from first attempt but it worth to spend time and learn it.

Community
  • 1
  • 1
gotva
  • 5,919
  • 2
  • 25
  • 35
0

Say following is your xml

<somexml>
  <name>Foo</name>
  <id>1</id>
</somexml>

you can then load this up in irb like

require 'rubygems'
require 'nokogiri'
@doc = Nokogiri::XML(File.open("test.xml"))
@doc.xpath("//somexml//id").children.first.to_s

This should give you the id you are looking for, Look at the documentation links given above for more helpers

Amit Acharya
  • 331
  • 2
  • 11
  • i have edited my question, unable to place my log here as it is too long , i'm facing problem with @doc.xpath("//somexml//id").children.first.to_s empty array returned – Anbazhagan p Dec 01 '13 at 06:22