ruby to_xml - 删除对象节点

时间:2011-05-19 20:17:10

标签: ruby xml arrays hash

我正在从活动记录中解析带有'to_xml'的哈希数组,我想知道我是否可以删除一些节点 这是解析代码:

arrayHash.to_xml(:root => "Cenario", :skip_types => true, :skip_instruct => true)

我得到这样的XML:

<Cenario>
  <Cenario nil="true"></Cenario>
  <Cenario>
    <TamanhoRegistro>
      <nomeCampo>Tamanho Registro</nomeCampo>
      <X>10</X>
      <Y>20</Y>
      <valor>10</valor>
    </TamanhoRegistro>
    <VersaoRegistro>
      <nomeCampo>Versao Registro</nomeCampo>
      <X>20</X>
      <Y>30</Y>
    </VersaoRegistro>
  </Cenario>
      .
      .
      .
      .
  <Cenario>
    <TamanhoRegistro>
      <nomeCampo>Tamanho Registro</nomeCampo>
      <X>10</X>
      <Y>20</Y>
      <valor>10</valor>
    </TamanhoRegistro>
    <VersaoRegistro>
      <nomeCampo>Versao Registro</nomeCampo>
      <X>20</X>
      <Y>30</Y>
    </VersaoRegistro>
  </Cenario>
</Cenario>

这是填充每个数组插槽的哈希。

hashExemplo = {
   "TamanhoRegistro" => {'nomeCampo' =>'Tamanho Registro', 'X'=> '10', 'Y'=> '20', 'valor' => '10'},
   "VersaoRegistro" =>  {'nomeCampo' =>'Versao Registro',    'X'=> '10', 'Y'=> '20', 'valor' => '10'},
id => id}

我想删除节点,将root更改为'Cenarios',将每个对象(hash)更改为'Cenario'。

顺便说一句,抱歉英语不好。尽力改善它。

干杯。

2 个答案:

答案 0 :(得分:1)

很抱歉看到没有人回答你的问题!我会试一试,虽然我不完全确定我会遵循它的原样。

如果我理解正确,你应该能够通过以下方式得到你想要的东西:

arrayHash.to_xml(:root => "Cenarios", :skip_types => true, :skip_instruct => true)

请注意,我将根更改为Cenarios复数。这将为您提供如下XML:

<Cenorios>
  <Cenorio>
    <TamanhoRegistro>
      <nomeCampo>Tamanho Registro</nomeCampo>
      <X>10</X>
      <Y>20</Y>
      <valor>10</valor>
    </TamanhoRegistro>
    <VersaoRegistro>
      <nomeCampo>Versao Registro</nomeCampo>
      <X>10</X>
      <Y>20</Y>
      <valor>10</valor>
    </VersaoRegistro>
  </Cenorio>
</Cenorios>

或者您是说要将TamanhoRegistroVersaoRegistro等等更改为Cenario?如果是这样,假设您的arrayHash是这样的:

arrayHash = [hashExemplo, otherHash]
你可以这样做:

arrayHash.map(&:values).flatten.to_xml(:root => "Cenorios", :skip_types => true)

会为您提供如下所示的XML:

<Cenorios>
  <Cenorio>
    <nomeCampo>Tamanho Registro</nomeCampo>
    <X>10</X>
    <Y>20</Y>
    <valor>10</valor>
  </Cenorio>
  <Cenorio>
    <nomeCampo>Versao Registro</nomeCampo>
    <X>10</X>
    <Y>20</Y>
    <valor>10</valor>
  </Cenorio>
  <Cenorio>
    <nomeCampo>Tamanho Registro</nomeCampo>
    <X>10</X>
    <Y>20</Y>
    <valor>10</valor>
  </Cenorio>
  <Cenorio>
    <nomeCampo>Versao Registro</nomeCampo>
    <X>10</X>
    <Y>20</Y>
    <valor>10</valor>
  </Cenorio>
</Cenorios>

本质上,#map将遍历数组,从散列中的每个散列值获取一个数组,因此数组现在将是一个数组数组,因此#flatten将其展平为一个数组。

这是回答你的问题,还是我错过了什么?

答案 1 :(得分:0)

而不是散列数组,开始使用数组的散列。 工作得更好,唯一的问题是subroot是哈希键和它的kinf烦人。但是没有人回答我......我猜我将不得不忍受......