Ruby XML в JSON конвертер?
есть ли библиотека для преобразования XML в JSON в Ruby?
6 ответов:
простой трюк:
сначала нужно
gem install json
, то при использовании рельсов вы можете сделать:require 'json' require 'active_support/core_ext' Hash.from_xml('<variable type="product_code">5</variable>').to_json #=> "{\"variable\":\"5\"}"
если вы не используете рельсы, то вы можете
gem install activesupport
, требует его и все должно работать гладко.пример:
require 'json' require 'net/http' require 'active_support/core_ext/hash' s = Net::HTTP.get_response(URI.parse('https://stackoverflow.com/feeds/tag/ruby/')).body puts Hash.from_xml(s).to_json
Я хотел бы использовать русификатор, простой XML и JSON парсер.
require "rubygems" require "crack" require "json" myXML = Crack::XML.parse(File.read("my.xml")) myJSON = myXML.to_json
Если вы хотите сохранить все атрибуты, я рекомендую cobravsmongoose http://cobravsmongoose.rubyforge.org/ который использует конвенцию барсука.
<alice sid="4"><bob sid="1">charlie</bob><bob sid="2">david</bob></alice>
будет:
{"alice":{"@sid":"4","bob":[{"$":"charlie","@sid":"1"},{"$":"david","@sid":"2"}]}}
код:
require 'rubygems' require 'cobravsmongoose' require 'json' xml = '<alice sid="4"><bob sid="1">charlie</bob><bob sid="2">david</bob></alice>' puts CobraVsMongoose.xml_to_hash(xml).to_json
вы можете найти
xml-to-json
gem полезное. Он поддерживает атрибуты, инструкции по обработке и инструкции DTD.установить
gem install 'xml-to-json'
использование
require 'xml/to/json' xml = Nokogiri::XML '<root some-attr="hello">ayy lmao</root>' puts JSON.pretty_generate(xml.root) # Use `xml` instead of `xml.root` for information about the document, like DTD and stuff
выдает:
{ "type": "element", "name": "root", "attributes": [ { "type": "attribute", "name": "some-attr", "content": "hello", "line": 1 } ], "line": 1, "children": [ { "type": "text", "content": "ayy lmao", "line": 1 } ] }
это простая производная от
xml-to-hash
.
предполагая, что вы используете libxml, вы можете попробовать вариант этого (отказ от ответственности, это работает для моего ограниченного случая использования, возможно, потребуется настройка, чтобы быть полностью общим)
require 'xml/libxml' def jasonized jsonDoc = xml_to_hash(@doc.root) render :json => jsonDoc end def xml_to_hash(xml) hashed = Hash.new nodes = Array.new hashed[xml.name+"_attributes"] = xml.attributes.to_h if xml.attributes? xml.each_element { |n| h = xml_to_hash(n) if h.length > 0 then nodes << h else hashed[n.name] = n.content end } hashed[xml.name] = nodes if nodes.length > 0 return hashed end
Если вы ищете скорость, я бы рекомендовал Вол так как это практически самый быстрый вариант из тех, которые уже упомянуты.
Я запустил некоторые тесты, используя XML-файл, который имеет 1.1 MB от omg.org/spec и вот результаты(в секундах):
xml = File.read('path_to_file') Ox.parse(xml).to_json --> @real=44.400012533 Crack::XML.parse(xml).to_json --> @real=65.595127166 CobraVsMongoose.xml_to_hash(xml).to_json --> @real=112.003612029 Hash.from_xml(xml).to_json --> @real=442.474890548