Ruby XML в JSON Converter? - PullRequest
       31

Ruby XML в JSON Converter?

53 голосов
/ 07 октября 2009

Есть ли библиотека для преобразования XML в JSON в Ruby?

Ответы [ 6 ]

95 голосов
/ 07 октября 2009

Простой трюк:

Сначала вам нужно gem install json, затем при использовании Rails вы можете сделать:

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

Если вы не используете Rails, тогда вы можете 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
23 голосов
/ 01 октября 2010

Я бы использовал Crack , простой анализатор XML и JSON.

require "rubygems"
require "crack"
require "json"

myXML  = Crack::XML.parse(File.read("my.xml"))
myJSON = myXML.to_json
13 голосов
/ 27 января 2011

Если вы хотите сохранить все атрибуты, я рекомендую 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
5 голосов
/ 14 июня 2015

Вы можете найти xml-to-json самоцвет полезным. Он поддерживает атрибуты, инструкции обработки и операторы 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.

2 голосов
/ 10 мая 2017

Если вы ищете скорость, я бы порекомендовал Ох , так как это довольно быстрый вариант из уже упомянутых.

Я провел несколько тестов, используя XML-файл, имеющий 1,1 МБ из 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
2 голосов
/ 22 февраля 2011

Предполагая, что вы используете 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
...