Ruby: синтаксический анализ XML в JSON - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть следующий XML:

<fruits>
    <fruit>APPLE</fruit>
    <fruit>PEACH</fruit>
    <fruit>BANANA</fruit>
</fruits>

Когда я анализирую его в JSON или объект, я получаю следующее:

{
    "fruits": {
        "fruit": [
            'APPLE', 'PEACH', 'BANANA'
        ]
    }
}

Но я хочу следующее:

{
    "fruits": [ 'APPLE', 'PEACH', 'BANANA' ]
}

Что мне делать?

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

В XmlSimple есть опция, называемая «GroupTags», которая предназначена для того, чтобы делать то, что вы хотите в преобразовании XML в хэш. Кажется, он работает, когда тег, который вы хотите сгруппировать, НЕ является корневым.

Например, если в вашем xml действительно есть другой корневой элемент:

<root>
 <fruits>
  <fruit>APPLE</fruit>
  <fruit>PEACH</fruit>
  <fruit>BANANA</fruit>
 </fruits>
</root>

Тогда вы можете сделать следующее:

options = {
           'ForceArray' => false, 
           'GroupTags' => {'fruits'=>'fruit'}
          }
XmlSimple.xml_in(xml, options)

#=> {"fruits"=>["APPLE", "PEACH", "BANANA"]}

Что соответствует JSON, который вы ищете.

К сожалению, если <fruits> является вашим корневым элементом, опция GroupTags не вступает в силу.

0 голосов
/ 07 декабря 2011

Что-то в этом роде?

#!/usr/bin/env ruby
require 'json'
require 'nokogiri'

xml = Nokogiri::XML(<<XML)
<fruits>
  <fruit>APPLE</fruit>
  <fruit>PEACH</fruit>
  <fruit>BANANA</fruit>
</fruits>
XML

results =
  xml.xpath('/*').map{|parent|
    [ parent.name,
      parent.xpath('*').map{|child| child.text } ] }

puts JSON.pretty_unparse(Hash[results])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...