如何将XML字符串添加到Nokogiri Builder

时间:2012-12-27 22:53:46

标签: ruby xml nokogiri

我有一个现有的Nokogiri构建器和一些来自不同来源的字符串中的xml节点。如何将此字符串添加到构建器中?

str = "<options><cc>true</cc></options>"
xml = Nokogiri::XML::Builder.new do |q|
  q.query do |f|
    f.name "awesome"
    f.filter str
  end
end

这可以将str转换为类似:

xml.to_xml
=> "<?xml version=\"1.0\"?>\n<query>\n  <name>awesome</name>\n  <filter>&lt;options&gt;&lt;cc&gt;true&lt;/cc&gt;&lt;/options&gt;</filter>\n</query>\n"

我发现了许多类似的东西,包括嵌套构建器和使用&lt;&lt;运算符,但无法将完整的xml节点树插入构建器块。 如何将该字符串转换为真实节点?

2 个答案:

答案 0 :(得分:11)

您使用<<发现了哪些问题?这对我有用:

xml = Nokogiri::XML::Builder.new do |q|
  q.query do |f|
    f.name "awesome"
    f << str
  end
end

并避免使用私有insert方法。

答案 1 :(得分:0)

而且,像往常一样,我在发布后不久就找到了答案......

xml = Nokogiri::XML::Builder.new do |q|
  q.query do |f|
    f.name "awesome"
    f.__send__ :insert, Nokogiri::XML::DocumentFragment.parse( str )
  end
end.to_xml

给你

=> "<?xml version=\"1.0\"?>\n<query>\n  <name>awesome</name>\n  <options>\n    <cc>true</cc>\n  </options>\n</query>\n"

编辑:这种方式适用于我&lt;&lt;因某种未知原因失败了。但是,正如其他人指出的那样,它通过直接访问旨在保护的:insert方法来工作。将其视为“不良做法”和最后的手段。