1

I am writing an internal application to monitor our Amazon listed products and am stuck with the Amazon Product Advertising API (amazon-ecs) Ruby gem. I would like to display on the screen the browse nodes similar to this:

"root category" -> all sub categories -> final category (the actual category the item is 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 the above should be displayed as:

Home & Garden -> Kitchen & Home -> Kitchen & Home Appliances -> Vacuuming, Cleaning & Ironing -> Vacuums & Floor Care -> Vacuums

I have tried get_array, and get_hash but these all return a value of just one long string.

Is there a way to easily do what i want to do using the amazon-ecs gem or should I process the string as XML and try to loop though this accordingly?

Steffen Opel
  • 63,899
  • 11
  • 192
  • 211

1 Answers1

1

This is a simple way to get there. Without any criteria showing how you determine what <Name> nodes are acceptable this 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 the code to find the 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 are duplicated, so uniq will clean them out.

See "How to avoid joining all text from Nodes when scraping" also.

Community
  • 1
  • 1
the Tin Man
  • 158,662
  • 42
  • 215
  • 303