Как удалить <hash></hash> из format.xml - PullRequest
5 голосов
/ 11 января 2012

У меня есть объект, который has_many дочерние объекты, которые должны быть представлены как XML.Это не является проблемой.Моя проблема в том, что я создал Hash, содержащий эти данные так, как это нужно парсеру.Но рельсы автоматически включают в себя весь файл с

<hash>
    <objects type="array">
        <object>
           ...
           ...
           ...
        </object>
    </objects>
</hash>

Мне нужно избавиться от type="array" и <hash>, как я могу справиться с этим?Я ничего не нашел в документации.

Ответы [ 3 ]

7 голосов
/ 30 сентября 2013

У меня была такая же проблема;

Это мой XML:

<?xml version="1.0" encoding="UTF-8"?>
<Contacts>
  <Contact type="array">
  </Contact>
</Contacts>

Я использовал это:

entries.to_xml

для преобразования хеш-данных в XML, но это оборачивает данные записей в <hash></hash>

Итак, я изменил:

entries.to_xml(root: "Contacts")

но это все еще обернуло преобразованный XML в «Контакты», изменив мой XML-код на

<Contacts>
 <Contacts>
  <Contact type="array">
   <Contact>
    <Name></Name>
    <Email></Email>
    <Phone></Phone>
   </Contact>
  </Contact>
 </Contacts>
</Contacts>

Так что это добавляет дополнительный КОРЕНЬ, которого я не хочу там.

Теперь решение, которое сработало для меня:

 entries["Contacts"].to_xml(root: "Contacts")

, который избегает <hash></hash> или любого дополнительного корня, который будет включен. Ура !!

1 голос
/ 11 января 2012
render :xml => @objects.to_xml(:root => :root_name, :skip_types => true)
0 голосов
/ 06 февраля 2017

При выполнении реальной разработки в реальном мире существует множество причин, по которым вам могут понадобиться фрагменты XML , даже если вы прекрасно понимаете, что действительная спецификация XML требует одного корня .

Тем не менее, Hash#to_xml ActiveSupport не поддерживает это.

Вот метод, который делает (добавить config/initializers/rootless_xml.rb):

class Hash
  def to_rootless_xml(options = {})
    require 'active_support/builder' unless defined?(Builder)

    options = options.dup
    options[:indent]  ||= 2
    options[:root]    ||= 'hash'
    options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent])

    builder = options[:builder]
    builder.instruct! unless options.delete(:skip_instruct)


    each { |key, value| ActiveSupport::XmlMini.to_tag(key, value, options) }
    yield builder if block_given?
    builder.target!
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...