2014-10-09 61 views
0

紅寶石to_xml我想產生類似:與重複相同的節點

<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<Test> 
    <Car> 
    <engine>A</engine> 
    <wheels>4</wheels> 
    </Car> 
    <Car> 
    <engine>B</engine> 
    <wheels>2</wheels> 
    </Car> 
</Test> 

但這樣做:

{"Car"=>[{"engine"=>"A", "wheels"=>"4"}, {"engine"=>"B", "wheels"=>"2"}]}.to_xml(:root => "Test") 

回報:

<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<Test> 
    <Car type=\"array\"> 
    <Car> 
     <engine>A</engine> 
     <wheels>4</wheels> 
    </Car> 
    <Car> 
     <engine>B</engine> 
     <wheels>2</wheels> 
    </Car> 
    </Car> 
</Test> 

你看,我不想要父節點"<Car type=\"array\">" 任何想法如何實現這一點?

謝謝!

+1

你想要的不是XML。 XML必須有一個根節點。 – Amadan 2014-10-09 15:50:20

+0

我添加了一個根節點,並且仍然... – TGI 2014-10-09 15:59:04

+0

你用什麼來生成XML?模板? REXML?引入nokogiri?我們需要看到一些代碼才能給你準確的答案。 – 2014-10-09 18:27:22

回答

1

對於這個簡單的情況下,你可以使用Array#to_xml像這樣

values = {"Car"=>[{"engine"=>"A", "wheels"=>"4"}, {"engine"=>"B","wheels"=>"2"}]}.values.pop 
#=> [{"engine"=>"A", "wheels"=>"4"}, {"engine"=>"B", "wheels"=>"2"}] 
values.to_xml(:root => "Test", skip_types: true, children: "Car") 
#=>"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Test>\n <Car>\n <engine>A</engine>\n <wheels>4</wheels>\n </Car>\n <Car>\n <engine>B</engine>\n <wheels>2</wheels>\n </Car>\n</Test>\n" 

所以更簡潔

{"Car"=>[{"engine"=>"A", "wheels"=>"4"}, {"engine"=>"B", "wheels"=>"2"}]}.values.pop.to_xml(:root => "Test", skip_types: true, children: "Car") 

將返回

<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<Test> 
    <Car> 
    <engine>A</engine> 
    <wheels>4</wheels> 
    </Car> 
    <Car> 
    <engine>B</engine> 
    <wheels>2</wheels> 
    </Car> 
</Test> 

Array#to_xml讓你在rootchildren選項傳遞這樣你就可以命名爲root「測試」和要求children「汽車」。如果這只是一個例子,而且情況更復雜,那麼可能會擔心這種情況,在這種情況下,我建議您查看builder,它允許您對節點及其命名約定進行巨大控制。

+0

謝謝,這就是我想要的! – TGI 2014-10-10 12:15:45

0

How about utilizing the :skip_types => true option?

{"Car"=>[{"engine"=>"A", "wheels"=>"4"}, {"engine"=>"B", "wheels"=>"2"}]}.to_xml(:root => "Test", :skip_types => true) 
+0

這隻能刪除type = \「array \」。父節點仍然存在 – TGI 2014-10-09 16:08:57

+0

父節點'Test'和父節點'Car'之間有什麼不同?只需重新命名密鑰。 – Amadan 2014-10-09 16:09:36

+0

父'Car'不能重命名,因爲它是數組的一部分 – TGI 2014-10-09 16:30:30