0

JRuby ( 1.6.7.2 ) で Nokogiri (1.5.9 - Java) を使用して、XML テンプレートをコピーして編集しています。複製されたドキュメントで要素を見つけるのに問題があります。

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

印刷の際はto_sto_xmllblockありますのでnew_children。私の間違いはどこですか?

4

1 に答える 1

0

問題を再現できません:

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_cssat

lblock.children = new_children

この場合new_childrenは文字列です。Nokogiri は、文字列を使用する前に XML フラグメントに変換する必要があることを十分に認識しています。これにより、DocumentFragments を作成する代わりに、XML または HTML ドキュメントを文字列で簡単に変更できます。

于 2013-05-21T05:11:08.640 に答える