ruby - How to iterate through browsenodes returned via amazon-ecs gem item lookup call? -


i writing internal application monitor our amazon listed products , stuck amazon product advertising api (amazon-ecs) ruby gem. display on screen browse nodes similar this:

"root category" -> sub categories -> final category (the actual category item in)

    <browsenode> <browsenodeid>770071031</browsenodeid> <name>robotic vacuums</name> <ancestors>   <browsenode>   <browsenodeid>125698031</browsenodeid>   <name>vacuums</name>     <ancestors>     <browsenode>     <browsenodeid>3147711</browsenodeid>     <name>vacuums &amp; floor care</name>       <ancestors>         <browsenode>         <browsenodeid>3576359031</browsenodeid>         <name>vacuuming, cleaning &amp; ironing</name>           <ancestors>             <browsenode>             <browsenodeid>391784011</browsenodeid>             <name>kitchen &amp; home appliances</name>               <ancestors>               <browsenode>               <browsenodeid>3147411</browsenodeid>               <name>categories</name>               <iscategoryroot>1</iscategoryroot>                 <ancestors>                 <browsenode>                 <browsenodeid>11052681</browsenodeid>                 <name>kitchen &amp; home</name>                   <ancestors>                   <browsenode>                   <browsenodeid>11052591</browsenodeid>                   <name>home &amp; garden</name>                   <ancestors>                     <browsenode>                     <browsenodeid>3146281</browsenodeid>                     <name>home &amp; garden</name>                     </browsenode>                   </ancestors>                 </browsenode>                 </ancestors>                 </browsenode>               </ancestors>             </browsenode>             </ancestors>           </browsenode>           </ancestors>         </browsenode>       </ancestors>     </browsenode>   </ancestors>   </browsenode> </ancestors> </browsenode> 

so above should displayed as:

home & garden -> kitchen & home -> kitchen & home appliances -> vacuuming, cleaning & ironing -> vacuums & floor care -> vacuums

i have tried get_array, , get_hash these return value of 1 long string.

is there way want using amazon-ecs gem or should process string xml , try loop though accordingly?

this simple way there. without criteria showing how determine <name> nodes acceptable returns them all:

require 'nokogiri'  xml = <<eot <browsenode> <browsenodeid>770071031</browsenodeid> <name>robotic vacuums</name> <ancestors>   <browsenode>   <browsenodeid>125698031</browsenodeid>   <name>vacuums</name>     <ancestors>     <browsenode>     <browsenodeid>3147711</browsenodeid>     <name>vacuums &amp; floor care</name>       <ancestors>         <browsenode>         <browsenodeid>3576359031</browsenodeid>         <name>vacuuming, cleaning &amp; ironing</name>           <ancestors>             <browsenode>             <browsenodeid>391784011</browsenodeid>             <name>kitchen &amp; home appliances</name>               <ancestors>               <browsenode>               <browsenodeid>3147411</browsenodeid>               <name>categories</name>               <iscategoryroot>1</iscategoryroot>                 <ancestors>                 <browsenode>                 <browsenodeid>11052681</browsenodeid>                 <name>kitchen &amp; home</name>                   <ancestors>                   <browsenode>                   <browsenodeid>11052591</browsenodeid>                   <name>home &amp; garden</name>                   <ancestors>                     <browsenode>                     <browsenodeid>3146281</browsenodeid>                     <name>home &amp; garden</name>                     </browsenode>                   </ancestors>                 </browsenode>                 </ancestors>                 </browsenode>               </ancestors>             </browsenode>             </ancestors>           </browsenode>           </ancestors>         </browsenode>       </ancestors>     </browsenode>   </ancestors>   </browsenode> </ancestors> </browsenode> eot doc = nokogiri::xml(xml) 

here's code find nodes:

doc.search('name').map(&:text).reverse.uniq.join(' -> ') # => "home & garden -> kitchen & home -> categories -> kitchen & home appliances -> vacuuming, cleaning & ironing -> vacuums & floor care -> vacuums -> robotic vacuums" 

some entries duplicated, uniq clean them out.

see "how avoid joining text nodes when scraping" also.


Comments