6

我有一个现有的 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"

我发现了很多很多类似的东西,包括嵌套构建器和使用 << 运算符,但是将完整的 xml 节点树插入构建器块没有任何作用。我怎样才能把那个字符串变成真正的节点?

4

2 回答 2

12

使用时发现了什么问题<<?这对我有用:

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

并避免使用私有insert方法。

于 2012-12-27T23:41:14.290 回答
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"

编辑:当 << 由于某种未知原因失败时,这种方式对我有用。但是,正如其他人指出的那样,它通过直接访问旨在受到保护的 :insert 方法来工作。将其视为“不好的做法”和最后的手段。

于 2012-12-27T23:06:08.880 回答