xml ruby json converter

xml - bash parsing json



Ruby XML to JSON Converter? (6)

Puede encontrar útil la gema xml-to-json . Mantiene atributos, instrucciones de procesamiento y declaraciones DTD.

Instalar

gem install ''xml-to-json''

Uso

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

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 } ] }

Es un derivado simple de xml-to-hash .

¿Hay una biblioteca para convertir XML a JSON en Ruby?


Si buscas velocidad, recomendaría Ox ya que es la opción más rápida de las ya mencionadas.

omg.org/spec algunos puntos de referencia usando un archivo XML que tiene 1.1 MB de omg.org/spec y estos son los resultados (en segundos):

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


Si desea conservar todos los atributos, le recomiendo cobravsmongoose http://cobravsmongoose.rubyforge.org/ que utiliza la convención de badgerfish.

<alice sid="4"><bob sid="1">charlie</bob><bob sid="2">david</bob></alice>

se convierte en:

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

código:

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


Suponiendo que está utilizando libxml, puede intentar una variación de esto (descargo de responsabilidad, esto funciona para mi caso de uso limitado, puede necesitar ajustes para ser completamente genérico)

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


Un simple truco:

Primero necesitas gem install json , luego cuando usas Rails puedes hacer:

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

Si no está utilizando Rails, entonces puede gem install activesupport , requerirlo y las cosas deberían funcionar sin problemas.

Ejemplo:

require ''json'' require ''net/http'' require ''active_support/core_ext/hash'' s = Net::HTTP.get_response(URI.parse(''https://.com/feeds/tag/ruby/'')).body puts Hash.from_xml(s).to_json


Yo usaría Crack , un simple analizador XML y JSON.

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