Nokogiri sta catturando i dati dei nodi errati in XML?
Domanda
Sto usando Nokogiri per analizzare un file XML e non funziona.
Quando provo a prendere da un nodo tre livelli più in alto, sto catturando i dati dal primo nodo del tipo.Ne ho eseguito il debug e il nodo su cui si trova dovrebbe essere quello giusto per ottenere i dati di cui ho bisogno, ma sta ancora estraendo i dati dal primo nodo di quel tipo.
Gli elementi che non si trovano nei nodi di livello superiore vengono inviati correttamente al file, ma quando inizio a salire sull'albero vengono scritti dati errati nel file.
require 'nokogiri'
f = File.new("grammystext.txt", "w+")
x = File.open("items.xml", "r")
doc = Nokogiri::XML(x)
x.close
doc.xpath('//CWItemExport//ItemExportData//CWItem//ProductID//ItemColor//ItemSize').each_with_index do |item, i|
f << item.parent.parent.parent.at_xpath('//CWVendor//VendorCode').content + ", "
f << item.parent.parent.parent.at_xpath('//CWVendor//VendorName').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemStyle').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemDescription').content + ", "
f << item.parent.parent.parent.at_xpath('//TaxID//TaxIDCode').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemDepartment//ItemDeptCode').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemDepartment//ItemDeptName').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemClass//ItemClassCode').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemClass//ItemClassName').content + ", "
f << item.attr("MainSize") + ", "
f << item.at_xpath('Sku').content + ", "
f << item.at_xpath('//ReplacementCost').content + ", "
f << item.at_xpath('//CurrentRetail').content + "\n"
puts item.parent.parent.parent if i == 6
break if i == 7
end
f.close
XML:
<CWItem action="New">
<CWVendor>
<VendorCode>5TH</VendorCode>
<VendorName>5TH SUN</VendorName>
<VendorAddress />
<VendorAddress2 />
<VendorCity />
<VendorZip />
<VendorPhone />
</CWVendor>
<ItemStyle>AMM024-B105</ItemStyle>
<ItemDescription>CALVERY</ItemDescription>
<ItemBoolPLU>N</ItemBoolPLU>
<TaxID>
<TaxIDCode TaxStore="1" TaxIDType="Normal">0</TaxIDCode>
<ComponentTax TxID="0" TxType="Normal" TxStartAmt="0.00" TxEndAmt="100000000.00" TxGlPayAcct=" ">0.000</ComponentTax>
</TaxID>
<ItemDepartment>
<ItemDeptCode>APPAR</ItemDeptCode>
<ItemDeptName>APPAR</ItemDeptName>
</ItemDepartment>
<ItemClass>
<ItemClassCode>TEE</ItemClassCode>
<ItemClassName>TEE-SHIRTS</ItemClassName>
</ItemClass>
<ItemSizeRun SizeRunCode="RUN" SizeRunName="">
<SizeDef SizeLabel="">
<Size SizeLabel="XS" Sequence="0">XS</Size>
<Size SizeLabel="S" Sequence="1">S</Size>
<Size SizeLabel="M" Sequence="2">M</Size>
<Size SizeLabel="L" Sequence="3">L</Size>
<Size SizeLabel="XL" Sequence="4">XL</Size>
<Size SizeLabel="XXL" Sequence="5">XXL</Size>
</SizeDef>
</ItemSizeRun>
<ProductID PID="">
<ItemColor ColorCode="N/A" ColorName="">
<ItemSize MainSize="L">
<Sku>400100018477</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="M">
<Sku>400100018460</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="S">
<Sku>400100018453</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XL">
<Sku>400100018484</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XS">
<Sku>400100031704</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>0.00</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XXL">
<Sku>400100035801</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>0.00</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
</ItemColor>
</ProductID>
</CWItem>
<CWItem action="New">
<CWVendor>
<VendorCode>5TH</VendorCode>
<VendorName>5TH SUN</VendorName>
<VendorAddress />
<VendorAddress2 />
<VendorCity />
<VendorZip />
<VendorPhone />
</CWVendor>
<ItemStyle>AMM025-B105</ItemStyle>
<ItemDescription>WINGMAN</ItemDescription>
<ItemBoolPLU>N</ItemBoolPLU>
<TaxID>
<TaxIDCode TaxStore="1" TaxIDType="Normal">0</TaxIDCode>
<ComponentTax TxID="0" TxType="Normal" TxStartAmt="0.00" TxEndAmt="100000000.00" TxGlPayAcct=" ">0.000</ComponentTax>
</TaxID>
<ItemDepartment>
<ItemDeptCode>APPAR</ItemDeptCode>
<ItemDeptName>APPAR</ItemDeptName>
</ItemDepartment>
<ItemClass>
<ItemClassCode>TEE</ItemClassCode>
<ItemClassName>TEE-SHIRTS</ItemClassName>
</ItemClass>
<ItemSizeRun SizeRunCode="RUN" SizeRunName="">
<SizeDef SizeLabel="">
<Size SizeLabel="XS" Sequence="0">XS</Size>
<Size SizeLabel="S" Sequence="1">S</Size>
<Size SizeLabel="M" Sequence="2">M</Size>
<Size SizeLabel="L" Sequence="3">L</Size>
<Size SizeLabel="XL" Sequence="4">XL</Size>
<Size SizeLabel="XXL" Sequence="5">XXL</Size>
</SizeDef>
</ItemSizeRun>
<ProductID PID="">
<ItemColor ColorCode="N/A" ColorName="">
<ItemSize MainSize="L">
<Sku>400100018514</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="M">
<Sku>400100018507</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="S">
<Sku>400100018491</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XL">
<Sku>400100018521</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XS">
<Sku>400100031711</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>0.00</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XXL">
<Sku>400100035818</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>0.00</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
</ItemColor>
</ProductID>
</CWItem>
Questa è la prima volta che uso Nokogiri, quindi potrei fare qualcosa di sbagliato qui.
Soluzione
Problema
Il problema è l'avvio degli xpath con //
.Questo dice di localizzare il nodo ovunque nel documento.
Nel seguente esempio semplificato, puoi vederlo utilizzando //
comporta la restituzione dello stesso elemento secondario (anziché l'elemento secondario dell'elemento dell'iterazione).
require 'nokogiri'
xml = %Q{
<root>
<item>
<subitem>1</subitem>
</item>
<item>
<subitem>2</subitem>
</item>
</root>
}
doc = Nokogiri::XML(xml)
doc.xpath('//root//item').each_with_index do |item, i|
puts item.at_xpath('//subitem').content
end
#=> 1
#=> 1
Se vuoi cercare ovunque all'interno di un nodo specifico, devi iniziare con un punto, ad es .//
.Applicando questo all'esempio semplificato, puoi vedere che otteniamo i risultati dei sottoelementi attesi:
doc = Nokogiri::XML(xml)
doc.xpath('//root//item').each_with_index do |item, i|
puts item.at_xpath('.//subitem').content
end
#=> 1
#=> 2
Soluzione
Per il tuo problema specifico, dovresti modificare gli xpath nell'iterazione degli elementi per includere il file .
all'inizio.Ad esempio la riga:
f << item.parent.parent.parent.at_xpath('//CWVendor//VendorCode').content + ", "
Verrebbe modificato in:
f << item.parent.parent.parent.at_xpath('.//CWVendor//VendorCode').content + ", "
Nel complesso questo ti darebbe:
doc.xpath('.//CWItemExport//ItemExportData//CWItem//ProductID//ItemColor//ItemSize').each_with_index do |item, i|
f << item.parent.parent.parent.at_xpath('.//CWVendor//VendorCode').content + ", "
f << item.parent.parent.parent.at_xpath('.//CWVendor//VendorName').content + ", "
f << item.parent.parent.parent.at_xpath('.//ItemStyle').content + ", "
f << item.parent.parent.parent.at_xpath('.//ItemDescription').content + ", "
f << item.parent.parent.parent.at_xpath('.//TaxID//TaxIDCode').content + ", "
f << item.parent.parent.parent.at_xpath('.//ItemDepartment//ItemDeptCode').content + ", "
f << item.parent.parent.parent.at_xpath('.//ItemDepartment//ItemDeptName').content + ", "
f << item.parent.parent.parent.at_xpath('.//ItemClass//ItemClassCode').content + ", "
f << item.parent.parent.parent.at_xpath('.//ItemClass//ItemClassName').content + ", "
f << item.attr("MainSize") + ", "
f << item.at_xpath('Sku').content + ", "
f << item.at_xpath('.//ReplacementCost').content + ", "
f << item.at_xpath('.//CurrentRetail').content + "\n"
puts item.parent.parent.parent if i == 6
break if i == 7
end
Con i risultati:
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, L, 400100018477, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, M, 400100018460, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, S, 400100018453, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, XL, 400100018484, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, XS, 400100031704, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, XXL, 400100035801, 44.80, 199.00
5TH, 5TH SUN, AMM025-B105, WINGMAN, 0, APPAR, APPAR, TEE, TEE-SHIRTS, L, 400100018514, 44.80, 199.00
Nota:Consiglierei anche di usare single /
invece di //
a meno che la struttura non sia nota.IL /
controlla i nodi figli diretti, il che semplifica il debug se si ottengono risultati imprevisti.
Altri suggerimenti
Questo sarà un po 'di Revisione del codice , ma spero che ti aiuterà con il tuo futuro analizzo.
- .
-
Se stai per creare csv, i altamente consiglia di utilizzare il gemma CSV. Garantisce che non creerà CSV rotto (che il tuo codice creerebbe il momento in cui uno dei campi contiene una virgola). Inoltre, consente di essere un po 'più descrittivo usando nomi di variabili.
-
Come è stato menzionato da altri, non utilizzare
//
se è possibile utilizzare/
. C'è una penalità di prestazione in aggiunta a non essere ciò che vuoi veramente in alcuni casi. -
La proliferazione di
item.parent.parent.parent
mi dice che sei andato troppo lontano lungo l'albero nel tuo cammino. Approfitta dei predicati di XPath (in[]
) per assicurarti di essere al livello corretto. -
Inoltre, purché stiamo approfittando di XPath, non avrai bisogno di un indice o di un
break
quando si dici a XPath a non darti più del primo 7. Non ho implementato questo perché Dato i tuoi dati non sono sicuro se ne hai bisogno.
Esempio:
CSV.open("grammystext.csv", "wb") do |csv|
items = doc.xpath('/CWItemExport/ItemExportData/CWItem[ProductID/ItemColor/ItemSize]') items.each do |item|
vendor_code = item.at_xpath('CWVendor/VendorCode').text
vendor_name = item.at_xpath('CWVendor/VendorName').text
item_style = item.at_xpath('ItemStyle').text
...
main_size = item.at_xpath('ProductID/ItemColor/ItemSize')['MainSize']
sku = item.at_xpath('ProductID/ItemColor/ItemSize/Sku').text
csv << [vendor_code, vendor_name, item_style, ... , main_size, sku]
end
end
.Non hai elemento root cwitemexport e figlio di radice: elemento IteRexportData.Se cambi il tuo XML su:
<CWItemExport>
<ItemExportData>
<CWItem action="New">
<CWVendor>
<VendorCode>5TH</VendorCode>
<VendorName>5TH SUN</VendorName>
<VendorAddress />
<VendorAddress2 />
<VendorCity />
<VendorZip />
<VendorPhone />
</CWVendor>
<ItemStyle>AMM024-B105</ItemStyle>
<ItemDescription>CALVERY</ItemDescription>
<ItemBoolPLU>N</ItemBoolPLU>
<TaxID>
<TaxIDCode TaxStore="1" TaxIDType="Normal">0</TaxIDCode>
<ComponentTax TxID="0" TxType="Normal" TxStartAmt="0.00" TxEndAmt="100000000.00" TxGlPayAcct="
">0.000</ComponentTax>
</TaxID>
<ItemDepartment>
<ItemDeptCode>APPAR</ItemDeptCode>
<ItemDeptName>APPAR</ItemDeptName>
</ItemDepartment>
<ItemClass>
<ItemClassCode>TEE</ItemClassCode>
<ItemClassName>TEE-SHIRTS</ItemClassName>
</ItemClass>
<ItemSizeRun SizeRunCode="RUN" SizeRunName="">
<SizeDef SizeLabel="">
<Size SizeLabel="XS" Sequence="0">XS</Size>
<Size SizeLabel="S" Sequence="1">S</Size>
<Size SizeLabel="M" Sequence="2">M</Size>
<Size SizeLabel="L" Sequence="3">L</Size>
<Size SizeLabel="XL" Sequence="4">XL</Size>
<Size SizeLabel="XXL" Sequence="5">XXL</Size>
</SizeDef>
</ItemSizeRun>
<ProductID PID="">
<ItemColor ColorCode="N/A" ColorName="">
<ItemSize MainSize="L">
<Sku>400100018477</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="M">
<Sku>400100018460</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="S">
<Sku>400100018453</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XL">
<Sku>400100018484</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XS">
<Sku>400100031704</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>0.00</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XXL">
<Sku>400100035801</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>0.00</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
</ItemColor>
</ProductID>
</CWItem>
<CWItem action="New">
<CWVendor>
<VendorCode>5TH</VendorCode>
<VendorName>5TH SUN</VendorName>
<VendorAddress />
<VendorAddress2 />
<VendorCity />
<VendorZip />
<VendorPhone />
</CWVendor>
<ItemStyle>AMM025-B105</ItemStyle>
<ItemDescription>WINGMAN</ItemDescription>
<ItemBoolPLU>N</ItemBoolPLU>
<TaxID>
<TaxIDCode TaxStore="1" TaxIDType="Normal">0</TaxIDCode>
<ComponentTax TxID="0" TxType="Normal" TxStartAmt="0.00" TxEndAmt="100000000.00" TxGlPayAcct="
">0.000</ComponentTax>
</TaxID>
<ItemDepartment>
<ItemDeptCode>APPAR</ItemDeptCode>
<ItemDeptName>APPAR</ItemDeptName>
</ItemDepartment>
<ItemClass>
<ItemClassCode>TEE</ItemClassCode>
<ItemClassName>TEE-SHIRTS</ItemClassName>
</ItemClass>
<ItemSizeRun SizeRunCode="RUN" SizeRunName="">
<SizeDef SizeLabel="">
<Size SizeLabel="XS" Sequence="0">XS</Size>
<Size SizeLabel="S" Sequence="1">S</Size>
<Size SizeLabel="M" Sequence="2">M</Size>
<Size SizeLabel="L" Sequence="3">L</Size>
<Size SizeLabel="XL" Sequence="4">XL</Size>
<Size SizeLabel="XXL" Sequence="5">XXL</Size>
</SizeDef>
</ItemSizeRun>
<ProductID PID="">
<ItemColor ColorCode="N/A" ColorName="">
<ItemSize MainSize="L">
<Sku>400100018514</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="M">
<Sku>400100018507</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="S">
<Sku>400100018491</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XL">
<Sku>400100018521</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>44.80</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XS">
<Sku>400100031711</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>0.00</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
<ItemSize MainSize="XXL">
<Sku>400100035818</Sku>
<Pricing Currency="USD">
<ReplacementCost>44.80</ReplacementCost>
<AverageCost>0.00</AverageCost>
<LandedCost>0.00</LandedCost>
<CurrentRetail MarkDowns=" ">199.00</CurrentRetail>
</Pricing>
</ItemSize>
</ItemColor>
</ProductID>
</CWItem>
</ItemExportData>
</CWItemExport>
.
Si ottiene il seguente nel tuo file grammystext.txt:
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, L, 400100018477, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, M, 400100018460, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, S, 400100018453, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, XL, 400100018484, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, XS, 400100031704, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, XXL, 400100035801, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, L, 400100018514, 44.80, 199.00
5TH, 5TH SUN, AMM024-B105, CALVERY, 0, APPAR, APPAR, TEE, TEE-SHIRTS, M, 400100018507, 44.80, 199.00
.
In alternativa, è possibile aggiungere gli elementi richiesti dopo aver letto il file:
require 'nokogiri'
f = File.new("grammystext.txt", "w+")
x = File.open("items.xml", "r")
xml = "<CWItemExport><ItemExportData>#{x.read}</CWItemExport></ItemExportData>"
doc = Nokogiri::XML(xml)
x.close
doc.xpath('//CWItemExport//ItemExportData//CWItem//ProductID//ItemColor//ItemSize').each_with_index do |item, i|
f << item.parent.parent.parent.at_xpath('//CWVendor//VendorCode').content + ", "
f << item.parent.parent.parent.at_xpath('//CWVendor//VendorName').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemStyle').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemDescription').content + ", "
f << item.parent.parent.parent.at_xpath('//TaxID//TaxIDCode').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemDepartment//ItemDeptCode').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemDepartment//ItemDeptName').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemClass//ItemClassCode').content + ", "
f << item.parent.parent.parent.at_xpath('//ItemClass//ItemClassName').content + ", "
f << item.attr("MainSize") + ", "
f << item.at_xpath('Sku').content + ", "
f << item.at_xpath('//ReplacementCost').content + ", "
f << item.at_xpath('//CurrentRetail').content + "\n"
puts item.parent.parent.parent if i == 6
break if i == 7
end
f.close
.