Ruby在这里解析新手。
我有一个看起来像的XML文件;
?xml version="1.0" encoding="iso-8859-1"?>
<Offers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ssc.channeladvisor.com/files/cageneric.xsd">
<Offer>
<Model><![CDATA[11016001]]></Model>
<Manufacturer><![CDATA[Crocs, Inc.]]></Manufacturer>
<ManufacturerModel><![CDATA[11016-001]]></ManufacturerModel>
...lots more nodes
<Custom6><![CDATA[<li>Bold midsole stripe for a sporty look.</li>
<li>Odor-resistant, easy to clean, and quick to dry.</li>
<li>Ventilation ports for enhanced breathability.</li>
<li>Lightweight, non-marking soles.</li>
<li>Water-friendly and buoyant; weighs only ounces.</li>
<li>Fully molded Croslite™ material for lightweight cushioning and comfort.</li>
<li>Heel strap swings back for snug fit, forward for wear as a clog.</li>]]></Custom6>
</Offer>
....lots lots more <Offer> entries
</Offers>
我想要做的是将每个'Offer'实例解析为CSV中我自己的行,我正在通过此代码进行:
require 'csv'
require 'nokogiri'
file = File.read('input.xml')
doc = Nokogiri::XML(file)
a = []
csv = CSV.open('output.csv', 'wb')
doc.css('Offer').each do |node|
a.push << node.content.split
end
a.each { |a| csv << a }
哪个运行得很好(一旦我认为CSV需要一个数组馈送到它,将.split放到node.content上'a'似乎满足。)
我的问题是我正在拆分空格而不是提供节点的每个元素(对不起,如果这不是正确的术语?)所以每个单词都会进入csv中自己的列。
有没有人有一些指示;
任何指针都非常赞赏
谢谢, 利安
答案 0 :(得分:6)
这假设每个Offer
元素始终具有相同的子节点(尽管它们可以为空):
CSV.open('output.csv', 'wb') do |csv|
doc.search('Offer').each do |x|
csv << x.search('*').map(&:text)
end
end
获取标题(来自第一个Offer
元素):
CSV.open('output.csv', 'wb') do |csv|
csv << doc.at('Offer').search('*').map(&:name)
doc.search('Offer').each do |x|
csv << x.search('*').map(&:text)
end
end
修改强>
search
和at
是Nokogiri函数,可以使用XPath或CSS选择器字符串。 at
将返回第一次出现的元素; search
将提供一系列匹配元素(如果未找到匹配项,则为空数组)。在这种情况下,*
将选择所有节点作为当前节点的直接子节点。
name
和text
都是Nokogiri函数(对于元素)。 name
提供元素的名称; text
提供节点的文本或CDATA内容。
答案 1 :(得分:0)
试试这个,然后修改它以进入你的csv:
doc.css('Offer').first.elements.each do |n|
puts "#{n.name}: #{n.content}"
end