Ruby XML to JSON Converter?

Esiste una libreria per convertire XML in JSON in Ruby?

Un semplice trucco:

Per prima cosa devi gem install json , quindi quando usi Rails puoi fare:

 require 'json' require 'active_support/core_ext' Hash.from_xml('5').to_json #=> "{\"variable\":\"5\"}" 

Se non si utilizza Rails, è ansible gem install activesupport , richiedere e le cose dovrebbero funzionare senza intoppi.

Esempio:

 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 

Userei Crack , un semplice parser XML e JSON.

 require "rubygems" require "crack" require "json" myXML = Crack::XML.parse(File.read("my.xml")) myJSON = myXML.to_json 

Se desideri mantenere tutti gli attributi, ti consiglio cobravsmongoose http://cobravsmongoose.rubyforge.org/ che usa la convenzione di badgerfish.

 charliedavid 

diventa:

 {"alice":{"@sid":"4","bob":[{"$":"charlie","@sid":"1"},{"$":"david","@sid":"2"}]}} 

codice:

 require 'rubygems' require 'cobravsmongoose' require 'json' xml = 'charliedavid' puts CobraVsMongoose.xml_to_hash(xml).to_json 

È utile trovare la gem xml-to-json utile. Mantiene attributi, istruzioni di elaborazione e istruzioni DTD.

Installare

 gem install 'xml-to-json' 

uso

 require 'xml/to/json' xml = Nokogiri::XML 'ayy lmao' puts JSON.pretty_generate(xml.root) # Use `xml` instead of `xml.root` for information about the document, like DTD and stuff 

produce:

 { "type": "element", "name": "root", "attributes": [ { "type": "attribute", "name": "some-attr", "content": "hello", "line": 1 } ], "line": 1, "children": [ { "type": "text", "content": "ayy lmao", "line": 1 } ] } 

È un derivato semplice di xml-to-hash .

Supponendo che tu stia usando libxml, puoi provare una variazione di questo (disclaimer, questo funziona per il mio caso d’uso limitato, potrebbe aver bisogno di un tweaking per essere completamente generico)

 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 

Se stai cercando la velocità raccomanderei Ox poiché è praticamente l’opzione più veloce da quelle già menzionate.

Ho eseguito alcuni benchmark utilizzando un file XML con 1,1 MB da omg.org/spec e questi sono i risultati (in secondi):

 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