如何在Ruby中修改以前设置的XML节点?

时间:2012-09-19 22:10:43

标签: ruby xml-builder

我有这样的功能:

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 个答案:

答案 0 :(得分:0)

Builder似乎不支持您要查找的内容,生成的XML存储为字符串,而不是节点或任何其他数据类型。

您应该重构代码,以便您希望在XML中呈现的数据至少在变量中管理,或者作为模型类或类集合管理;并将XML的表示与数据的存储和逻辑分开。

您还可以尝试另一个支持使用非字符串数据类型的gem,例如GyokuNokogiri。例如,使用Gyoku,您可以从普通的ruby哈希创建XML,并在必要时简单地编辑哈希值。您可以使用Gyoku.xml(my_hash)随时输出当前的XML字符串。