問題を再現できません:
require 'nokogiri'
new_children = Nokogiri::XML::DocumentFragment.parse('<foo>bar</foo>')
doc = Nokogiri::XML(<<EOF)
<xml>
<lblock blockName="WINDOW_LIST" />
</xml>
EOF
lblock = doc.xpath(".//lblock[@blockName='WINDOW_LIST']").first
lblock.children = new_children # kind of NodeSet or Node
copy_doc = doc.dup(1) # or dup(0)
lblock = copy_doc.xpath(".//lblock[@blockName='WINDOW_LIST']").first # nil
puts lblock.to_xml
puts
puts doc.to_xml
実行すると、次のように出力されます。
<lblock blockName="WINDOW_LIST">
<foo>bar</foo>
</lblock>
<?xml version="1.0"?>
<xml>
<lblock blockName="WINDOW_LIST"><foo>bar</foo></lblock>
</xml>
とは言うものの、以下のコードはクリーンアップして、より簡単な記述方法を示しています。
require 'nokogiri'
new_children = '<foo>bar</foo>'
doc = Nokogiri::XML(<<EOF)
<xml>
<lblock blockName="WINDOW_LIST" />
</xml>
EOF
lblock = doc.at_xpath('//lblock')
lblock.children = new_children
copy_doc = doc.dup(1)
lblock = copy_doc.at_css('lblock')
puts lblock.to_xml
puts
puts doc.to_xml
実行後にこれも出力します:
<lblock blockName="WINDOW_LIST">
<foo>bar</foo>
</lblock>
<?xml version="1.0"?>
<xml>
<lblock blockName="WINDOW_LIST"><foo>bar</foo></lblock>
</xml>
コードの分析:
lblock = doc.at_xpath('//lblock')
lblock = copy_doc.at_css('lblock')
これらは、同じものを見つけるために 2 つの異なる方法を使用します。この場合、サンプル XML は単純だったので、at
最初に一致したノードを返す を使用しました。それぞれ XPath と CSS で動作しますat_xpath
。は、文字列が CSS か XPath かを判断しようとし、だまされているのを見たことはありますが、通常は正しい結果になります。at_css
at
lblock.children = new_children
この場合new_children
は文字列です。Nokogiri は、文字列を使用する前に XML フラグメントに変換する必要があることを十分に認識しています。これにより、DocumentFragments を作成する代わりに、XML または HTML ドキュメントを文字列で簡単に変更できます。