Как я могу изменить ранее установленный узел XML в Ruby?

У меня есть такая функция:

def add_auth_fields
    xml = Builder::XmlMarkup.new(:target => '')
    xml.instruct! :xml

    xml.inquiry do |inquiry|
      inquiry.authentication do |auth|
        auth.username USERNAME
        auth.password PASSWORD
      end
    end

    xml
end

Как я могу получить доступ к xml.inquiry узел в более позднее время, чтобы добавить больше данных внутри этого узла?

Если я позвоню xml.inquiry do |inquiry| опять же, он просто добавляет еще один узел в мой XML.

Вот еще один пример, где я хочу изменить значение foo, но вместо этого он добавляет еще один узел foo в xml.

[195] pry(main)> xml_markup = Builder::XmlMarkup.new
=> <pretty_inspect/>

[196] pry(main)> xml_markup.foo 'bar'
=> "<pretty_inspect/><foo>bar</foo>"

[197] pry(main)> xml_markup.foo 'test'
=> "<pretty_inspect/><foo>bar</foo><foo>test</foo>"

1 ответ

Решение

Кажется, что Builder не поддерживает то, что вы ищете, сгенерированный XML хранится в виде строки, а не узлов или любого другого типа данных.

Вы должны реорганизовать свой код так, чтобы данные, которые вы хотите представить в XML, управлялись как минимум в переменной или как класс модели или набор классов; и отделить представление XML от хранения и логики данных.

Вы также можете попробовать другой гем, который поддерживает работу с нестроковым типом данных, например, Gyoku или Nokogiri. Например, с помощью Gyoku вы можете создать XML из простого хэша ruby ​​и при необходимости просто отредактировать значения в хэше. Вы можете вывести текущую строку XML в любой точке, используя Gyoku.xml(my_hash),

Другие вопросы по тегам