Как получить доступ и прочитать тег XML и их содержимое в Ruby - PullRequest
1 голос
/ 28 апреля 2011

В одном классе наш учитель дал нам проект для преобразования CSV в формат XML и снова из XML в CSV и сказал нам выбирать между Python и Ruby.Я предпочел Ruby, так как он казался мне более простым и понятным как язык.

Я сделал первую часть, конвертировал из CSV в XML, и он отлично работает.Но когда я хочу конвертировать из XML в CSV, мой код работает, но только для определенного файла XML.Я хочу, чтобы он работал для любого XML-файла.

Вот мой XML, и я не помещаю все это, потому что он большой:

<?xml version="1.0"?>
<records>
   <company>
     <id>p1</id>
     <name>Skoda</name>
     <price>10000</price>
     <stock>4</stock>
     <country>Czech Republic</country>
  </company>
  <company>
     <id>p2</id>
     <name>Mercedes</name>
     <price>50000</price>
     <stock>5</stock>
     <country>Germany</country>
  </company>
  <company>
     <id>p3</id>
     <name>Alfa Romeo</name>
     <price>18000</price>
     <stock>19</stock>
     <country>Italy</country>
  </company>
  <company>
     <id>p4</id>
     <name>Fiat</name>
     <price>1500</price>
     <stock>15000</stock>
     <country>Italy</country>
  </company>
</records>

И мой код Ruby для преобразования XML в CSV:

xmlinputfile = gets.chomp
print "\n"
csvoutputfile = gets.chomp
print "\n"
puts "Writing CSV..."
print "\n"
xml_file = File.open(xmlinputfile, "r")
xml = REXML::Document.new( xml_file )
csv_file = File.new(csvoutputfile, "w") 
xml.elements.each("records") do |e|
  e.elements.each("company") do |f|
    csv_file.puts f.elements['id'].text + "," + f.elements['name'].text + "," 
      + f.elements['price'].text + "," + 
      f.elements['stock'].text + ","+ f.elements['country'].text + ","
  end
end
print "Job Done !!! \n"
puts "Contents of #{xmlinputfile} were written in CSV format to #{csvoutputfile}.\n\n"

Проблема в том, что этот код Ruby будет выполнять свою работу только для вышеуказанного XML, а не для любого другого кода XML, потому чтоЯ не могу найти способ заставить код самостоятельно читать теги XML и размещать их содержимое в формате CSV.В этом коде выше я помещаю себя вручную теги XML в качестве строкового аргумента в

f.elements ['xml_tag']

и, таким образом, это может занятьих содержание и писать в формате CSV.Но это нехорошо, потому что, когда я беру другой XML с большим количеством тегов, он не будет работать.

Что я хочу сделать, так это то, что, когда я вставляю имя входного файла xml, код сам находит, сколько теговтам есть в xml и взять их содержимое и выложить в формате CSV.

Пожалуйста, это очень важно.Я должен дать этот проект за 3 дня, и я пытался почти неделю и ничего не делал.Вы, ребята, мой последний шанс!

1 Ответ

0 голосов
/ 28 апреля 2011
require 'nokogiri' # http://nokogiri.org  aka  gem install nokogiri
xmldoc = Nokogiri::XML(IO.read("records.xml"))

rows = []
xmldoc.xpath('/*/*').each do |row_xml|
  row_values = []
  rows << row_values
  row_xml.xpath('./*').each do |field|
    row_values << field.text
  end
end

require 'pp'
pp rows
#=> [["p1", "Skoda", "10000", "4", "Czech Republic"],
#=>  ["p2", "Mercedes", "50000", "5", "Germany"],
#=>  ["p3", "Alfa Romeo", "18000", "19", "Italy"],
#=>  ["p4", "Fiat", "1500", "15000", "Italy"]]

Или, более кратко, вы можете получить те же результаты с:

rows = xmldoc.xpath('/*/*').map{ |row| row.xpath('./*').map(&:text) }

Если вы хотите имена «столбцов»:

columns = xmldoc.xpath('/*/*[position()=1]/*').map(&:name)
#=> ["id", "name", "price", "stock", "country"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...