簡體   English   中英

如何使用 Ruby 和 Nokogiri 將 XML 節點解析為 CSV

[英]How to parse XML nodes to CSV with Ruby and Nokogiri

我有一個 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&trade; 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>

我想在 CSV 文件中將“Offer”的每個實例解析為自己的行:

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 } 

這運行得很好,除了我在空格而不是 Offer 節點的每個元素上進行拆分,因此每個單詞都進入 CSV 文件中的自己的列。

有沒有辦法獲取每個節點的內容以及如何使用節點名稱作為 CSV 文件中的標題?

這假設每個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

searchat是可以采用 XPath 或 CSS 選擇器字符串的 Nokogiri 函數。 at將返回元素的第一次出現; search將提供匹配元素的數組(如果沒有找到匹配,則提供一個空數組)。 在這種情況下, *將選擇作為當前節點的直接子節點的所有節點。

nametext也是 Nokogiri 函數(對於元素)。 name提供元素的名稱; text提供節點的文本或 CDATA 內容。

試試這個,並修改它以推送到您的 CSV:

doc.css('Offer').first.elements.each do |n|
  puts "#{n.name}: #{n.content}"
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM