【问题标题】:Ruby to_xml with repeating same nodes具有重复相同节点的 Ruby to_xml
【发布时间】:2014-12-04 15:15:06
【问题描述】:

我想生成类似的东西:

<?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>

你看,我不想要父节点"&lt;Car type=\"array\"&gt;" 知道如何实现这一目标吗?

谢谢!

【问题讨论】:

  • 你想要的不是 XML。 XML 必须有一个根节点。
  • 我加了一个根节点,还是..
  • 您使用什么来生成 XML?模板? REXML?野古切?我们需要查看一些代码才能给您准确的答案。

标签: ruby xml hash


【解决方案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,它可以让您对节点及其命名约定进行极大的控制。

【讨论】:

  • 谢谢,这正是我想要的!
【解决方案2】:

How about utilizing the :skip_types =&gt; true option?

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

【讨论】:

  • 这只会删除 type=\"array\"。父节点还在
  • 父节点Test和父节点Car有什么不同?只需重命名密钥。
  • 父“汽车”不能重命名,因为它是数组的一部分
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2014-11-22
  • 2019-12-13
  • 1970-01-01
相关资源
最近更新 更多