Jason Milam
Jason Milam

Reputation: 111

Read XML file with Nokogiri

I currently have an XML file that is reading correctly except for one part. It is an item list and sometimes one item has multiple barcodes. In my code it only pulls out the first. How can I iterate over multiple barcodes. Please see code below:

def self.pos_import(xml)
  Plu.transaction do
    Plu.delete_all
    xml.xpath('//Item').each do |xml|
      plu_import = Plu.new
      plu_import.update_pointer = xml.at('Update_Type').content
      plu_import.plu = xml.at('item_no').content
      plu_import.dept = xml.at('department').content
      plu_import.item_description = xml.at('item_description').content
      plu_import.price = xml.at('item_price').content
      plu_import.barcodes = xml.at('UPC_Code').content
      plu_import.sync_date = Time.now
      plu_import.save!
    end
  end

My test XML file looks like this:

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<items>
  <Item>
    <Update_Type>2</Update_Type>
    <item_no>0000005110</item_no>
    <department>2</department>
    <item_description>DISC-ALCOHOL PAD STERIL 200CT</item_description>
    <item_price>7.99</item_price>
    <taxable>No</taxable>
    <Barcode>
        <UPC_Code>0000005110</UPC_Code>
        <UPC_Code>1234567890</UPC_Code>
    </Barcode>
  </Item>
</Items>

Any ideas how to pull both UPC_Code fields out and write them to my database?

Upvotes: 0

Views: 123

Answers (2)

Jason Milam
Jason Milam

Reputation: 111

Thanks for all the great tips. It definitely led me in the right direction. The way that I got it to work was just adding a period before the double //.

plu_import.barcodes = xml.xpath('.//UPC_Code').map(&:content)

Upvotes: 0

Max Williams
Max Williams

Reputation: 32933

.at will always return a single element. To get an array of elements use xpath like you do to get the list of Item elements.

plu_import.barcodes = xml.xpath('//UPC_Code').map(&:content)

Upvotes: 1

Related Questions