ruby to_xml - удалить узлы объекта - PullRequest
1 голос
/ 20 мая 2011

Я анализирую массив хэшей с '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}

Я хотел удалить узел, изменить корень на 'Cenarios', а каждый объект (хеш) на 'Cenario'.

Кстати, извините за плохой английский.Стараюсь изо всех сил, чтобы улучшить его.

Приветствия.

Ответы [ 2 ]

1 голос
/ 21 мая 2011

Жаль, что никто не ответил на ваш вопрос! Я попробую, хотя я не совсем уверен, что понимаю, что это такое.

Если я вас правильно понимаю, вы сможете получить то, что хотите, выполнив следующие действия:

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>

Или вы говорили, что хотите, чтобы TamanhoRegistro и VersaoRegistro и такие были изменены на 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 сгладит это в один массив.

Это отвечает на ваш вопрос, или я что-то пропустил?

0 голосов
/ 21 мая 2011

Вместо массива хэшей начали использовать хэши массивов.Работает лучше, единственная проблема в том, что subroot является хеш-ключом и его раздражает.но никто не ответил мне так ... думаю, мне придется с этим жить ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...