Как создать XML из файла Yaml с помощью Nokogiri? - PullRequest
0 голосов
/ 01 ноября 2011

Я хочу прочитать и открыть файл .yml и создать XML с помощью Nokogiri? Кто-нибудь может сказать мне, как это сделать?

Это формат Yaml:

getOrderDetails: 
  Id: '114'
  Name: 'XYZ' 

Это тот XML, который мне нужен:

<product> <id>123</id> <name>xyz</name> </product>

А это рубиновый файл:

require 'nokogiri'
require 'rubygems'
require 'spec/spec_helper'
require 'yaml'

@doc = YAML.load(File.open(File.expand_path('/Workspace/XML_Parsing/getDetails_api.yml'‌​)))
@doc = File.open('/Workspace/XML_Parsing/getDetails_api.yml')
builder = Nokogiri::XML::Builder.new do |xml|
  xml.doc {
    @doc.each do |o|
      o.doc.child {
        puts "eval(#{doc(:getDetails(['Id']))})"
        puts "#{doc['NameCode']}"
        #o.OrderNo
        #o.EnterpriseCode
      }
    end
  }
end

puts builder.to_xml

1 Ответ

2 голосов
/ 01 ноября 2011

Если вы знаете поля, которые вы хотите конкретно:

require 'yaml'
require 'nokogiri'

yaml = "getOrderDetails:
  Id: '114'
  Name: 'XYZ'"
doc = YAML.load yaml

output = Nokogiri::XML::Builder.new do |xml|
  xml.product{
    xml.id   doc["getOrderDetails"]["Id"]
    xml.name doc["getOrderDetails"]["Name"]
  }
end
puts output.to_xml
#=> <?xml version="1.0"?>
#=> <product>
#=>   <id>114</id>
#=>   <name>XYZ</name>
#=> </product>

Если вы хотите создать произвольный файл XML на основе имен ключей Yaml:

output = Nokogiri::XML::Builder.new do |xml|
  xml.product{
    doc["getOrderDetails"].each do |name,value|
      xml.send(name.downcase,value)
    end
  }
end
puts output.to_xml
#=> <?xml version="1.0"?>
#=> <product>
#=>   <id>114</id>
#=>   <name>XYZ</name>
#=> </product>
...