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 に答える