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