Nokogiri가 XML에서 잘못된 노드 데이터를 가져옵니까?
문제
Nokogiri를 사용하여 XML 파일을 구문 분석하고 있는데 작동하지 않습니다.
3레벨 위의 노드에서 데이터를 가져오려고 하면 해당 유형의 첫 번째 노드에서 데이터를 가져옵니다.디버깅했는데 노드가 필요한 데이터를 얻는 데 적합한 노드여야 하지만 여전히 해당 유형의 첫 번째 노드에서 데이터를 가져오고 있습니다.
상위 레벨 노드에 없는 항목은 파일에 정상적으로 출력되지만 트리 위로 이동하기 시작하면 파일에 잘못된 데이터가 기록됩니다.
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>
Nokogiri를 처음 사용하므로 여기서 뭔가 잘못되었을 수 있습니다.
해결책
문제
문제는 다음과 같이 xpath를 시작하는 것입니다. //
.이는 문서의 어느 위치에서나 노드를 찾는 것을 의미합니다.
다음의 간단한 예에서는 다음을 사용하여 확인할 수 있습니다. //
결과적으로 동일한 하위 항목이 반환됩니다(반복 항목의 하위 항목이 아님).
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
특정 노드 내의 아무 곳이나 보려면 마침표로 시작해야 합니다. 즉, .//
.이를 단순화된 예에 적용하면 예상된 하위 항목 결과를 얻는 것을 볼 수 있습니다.
doc = Nokogiri::XML(xml)
doc.xpath('//root//item').each_with_index do |item, i|
puts item.at_xpath('.//subitem').content
end
#=> 1
#=> 2
해결책
특정 문제의 경우 항목 반복에서 xpath를 변경하여 다음을 포함해야 합니다. .
처음에는.예를 들어 다음 줄은 다음과 같습니다.
f << item.parent.parent.parent.at_xpath('//CWVendor//VendorCode').content + ", "
다음과 같이 변경됩니다.
f << item.parent.parent.parent.at_xpath('.//CWVendor//VendorCode').content + ", "
전반적으로 이것은 다음을 제공합니다.
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
결과는 다음과 같습니다.
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
메모:싱글을 사용하는 것도 추천합니다 /
대신에 //
구조가 알려지지 않은 한.그만큼 /
예상치 못한 결과가 나올 경우 디버그하기가 더 쉬워지도록 직접 하위 노드를 확인합니다.
다른 팁
이것은 코드 검토 의 약간이 될 것입니다.하지만 미래의 파싱을 통해 당신을 도울 것입니다.
-
CSV를 만드 나가면 i 매우 csv gem을 사용하는 것이 좋습니다. 깨진 CSV (코드가 쉼표가 포함 된 순간에 코드가 생성되는 순간을 만드는 경우)를 만들지 못하게합니다. 또한 변수 이름을 사용하여 조금 더 설명이 될 수 있습니다.
-
다른 사람들이 언급 한 바와 같이
//
를 사용할 수있는 경우/
를 사용하지 마십시오. 어떤 경우에는 실제로 원하는 것 외에도 실적 패널티가 있습니다. -
item.parent.parent.parent
의 확산은 당신이 당신의 길에서 나무를 너무 멀리 멀리 떨어 뜨 렸습니다. 올바른 수준을 보장하기 위해 XPath의 술어 ([]
)를 활용하십시오. -
또한 XPath를 활용하는 한 XPath가 처음 7 이상을주지 않으려는 경우 인덱스 또는
break
가 필요하지 않습니다.이 때문에 이것을 구현하지 못했습니다. 귀하의 데이터가 주어지면 전혀 필요로하는지 확실하지 않습니다.
예 :
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
.루트 요소가 없습니다. cwitemexport 및 root의 자식 : itemExportData 요소.XML을 변경 한 경우 :
<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>
.
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
.
또는 파일을 읽은 후 필요한 요소를 추가 할 수 있습니다.
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
.