2010-11-24 15 views

Antwort

10
require 'active_support' #for to_xml() 'gem install activesupport' use the 2.3 branch 
require 'json' #part of ruby 1.9 but otherwise 'gem install json' 

my_json = "{\"test\":\"b\"}" 
my_xml = JSON.parse(my_json).to_xml(:root => :my_root) 

Beachten Sie auch das Root-Argument von to_xml. Wenn Sie keinen Root angeben, wird das Wort 'hash' als Root verwendet, was nicht besonders schön ist.

+0

Benötige ich einen Edelstein für den 'active_support'? Ich bekomme einen Fehler, wenn ich versuche, es zu "fordern". –

+0

ja. Active Support ist Teil von Ruby on Rails. Sie sollten es mit 'gem install activesupport' installieren können. – rwilliams

+0

Jetzt, wenn ich versuche, es auszuführen, erhalte ich den folgenden Fehler: 'undefinierte Methode' to_xml 'für # (NoMethodError) '. 'JSON.parse' sollte einen Hash zurückgeben, nicht wahr? –

-1

ich weiß nicht, ein magisches Juwel, es zu tun, aber was Sie leicht tun können, ist Xml zu Hash und Hash zu Json.

require 'active_support' 
my_hash = Hash.from_xml(my_xml) 

dann

require 'json' 
my_json = my_hash.to_json 
+3

Ich versuche, JSON in XML zu konvertieren, nicht XML in JSON –

+0

Werden diese merkwürdigen Zitate überhaupt funktionieren? Das sieht nicht besonders gesund aus. – jwueller

+0

@belusive: Ja, sie sehen auch funky aus. Ich denke, sie sind schlaue Zitate. –

6

In Bezug auf @rwilliams aka r-dub Antwort:

ActiveSupport moved its components in separate Module für die Granularität. Anstatt alles auf einmal zu laden, können wir ihm sagen, dass er nur bestimmte Teilmengen laden soll, oder, wenn wir noch wählen, können wir alles auf einmal laden. Egal was, wir können require 'activesupport' nicht wie früher verwenden, stattdessen müssen wir require 'activesupport/all' oder einen der Subsets verwenden.

>> require 'active_support/core_ext/array/conversions' #=> true 
>> [{:a => 1, :b => 2}, {:c => 3}].to_xml 
=> "<?xml version="1.0" encoding="UTF-8"?>\n<objects type="array">\n <objects a="1" b="2" type="hash"/>\n <objects c="3" type="hash"/>\n</objects>\n" 

Darüber hinaus enthält Active JSON-Unterstützung, so dass Sie die gesamte Umwandlung mit AR tun können:

>> require 'active_support/all' #=> true 
>> json = {'foo'=>'bar'}.to_json #=> "{"foo":"bar"}" 
>> ActiveSupport::JSON.decode(json).to_xml #=> "<?xml version="1.0" encoding="UTF-8"?>\n<hash>\n <foo>bar</foo>\n</hash>\n" 

Die erste Zeile lädt in den XML- und JSON-Konvertierungen. In der zweiten Zeile wird ein JSON-Beispiel zum Testen eingerichtet. Die dritte Zeile nimmt den JSON vor, dekodiert ihn und konvertiert ihn dann in XML.

1

Die anderen Antworten erlauben keine einfachen rekursiven Konvertierungen. Wie in this answer on Code Review erläutert, benötigen Sie einen benutzerdefinierten Helfer, um das einfache Format zu erstellen, nach dem Sie suchen.

Es wird diese drehen ...

data = [ 
    { 'name' => 'category1', 
    'subCategory' => [ 
     { 'name' => 'subCategory1', 
     'product' => [ 
      { 'name' => 'productName1', 
      'desc' => 'desc1' }, 
      { 'name' => 'productName2', 
      'desc' => 'desc2' } ] 
     } ] 
    }, 
    { 'name' => 'category2', 
    'subCategory' => [ 
     { 'name' => 'subCategory2.1', 
     'product' => [ 
      { 'name' => 'productName2.1.1', 
      'desc' => 'desc1' }, 
      { 'name' => 'productName2.1.2', 
      'desc' => 'desc2' } ] 
     } ] 
    }, 
] 

... in diese:

<?xml version="1.0"?> 
<root> 
    <category> 
    <name>category1</name> 
    <subCategory> 
     <name>subCategory1</name> 
     <product> 
     <name>productName1</name> 
     <desc>desc1</desc> 
     </product> 
     <product> 
     <name>productName2</name> 
     <desc>desc2</desc> 
     </product> 
    </subCategory> 
    </category> 
    <category> 
    <name>category2</name> 
    <subCategory> 
     <name>subCategory2.1</name> 
     <product> 
     <name>productName2.1.1</name> 
     <desc>desc1</desc> 
     </product> 
     <product> 
     <name>productName2.1.2</name> 
     <desc>desc2</desc> 
     </product> 
    </subCategory> 
    </category> 
</root> 
Verwandte Themen