2011-01-30 10 views
4

内のテキスト・ノード上の鋸山のスワップを使用して、あなたがこれを行うことができます:Hpricotでドキュメント・

> doc = Hpricot("a") 
=> #<Hpricot::Doc "a"> 
> doc.children.first.swap('b') 
=> ["b"] 
> doc.to_s 
=> "b" 

をしかし、あなたは鋸山で同じことをしようとした場合、あなたがエラーを取得:

どう
> doc = Nokogiri::HTML::DocumentFragment.parse('a') 
=> #<Nokogiri::HTML::DocumentFragment:0x825bb88c name="#document-fragment" children=[#<Nokogiri::XML::Text:0x825bb580 "a">]> 
> doc.children.first.swap('b') 
RuntimeError: error parsing fragment (1) 
from /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:509:in `in_context' 
from /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:509:in `parse' 
from /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/lib/nokogiri/html/document_fragment.rb:22:in `initialize' 
from /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:485:in `new' 
from /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:485:in `fragment' 
from /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:885:in `coerce' 
from /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:382:in `replace' 
from /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:407:in `swap' 
from (irb):63 

Nokogiriのテキストノードでswapを使用できますか?

編集:これはswapの引数の問題ではありません、それは例えば、受信機

に問題だということに注意してください:

> doc = Nokogiri::HTML::DocumentFragment.parse('<a>b</a>') 
=> #<Nokogiri::HTML::DocumentFragment:0x825bb508 name="#document-fragment" children=[#<Nokogiri::XML::Element:0x825bb1fc name="a" children=[#<Nokogiri::XML::Text:0x825bab6c "b">]>]> 
> doc.at("a").swap('x') 
=> #<Nokogiri::XML::Element:0x825bb1fc name="a" children=[#<Nokogiri::XML::Text:0x825bab6c "b">]> 
> doc.to_s 
=> "x" 
+1

ご質問のほぼ100は、私が参照するのを待つ場合は私を許して、あなたはまだあなたから受け入れマークで飾っされていない助けるために自分の自由な時間を寄付個人によって答えたことを考えるとどのように私の応答あなたのもう1つの質問は、これに答える時間を費やす前に判明します。 – Phrogz

+0

私の悪い犬;私はあなたの答えを見なかった! –

答えて

2

ここでテキストノードを作成するための一つの方法ですつまり、ドキュメント・内部スワップで使用することができる。

require 'nokogiri'  
frag = Nokogiri::HTML::DocumentFragment.parse("foo") 
foo = frag.children.first 
foo.swap(Nokogiri::XML::Text.new("bar", foo.document)) 
puts frag 
#=> bar 

編集:ここには、以下に基づいて、ここでは微妙なことが起こっています。あなたのためにbug reportを提出しました。

require 'nokogiri' 

elems = "<a1 /><a2>foo</a2><a3 /><a4>bar</a4>baz" 
rooted = "<r>#{elems}</r>" 
doc = Nokogiri::XML rooted 
doc.at_xpath('/r/a1').swap('x1')     # Element->text 
doc.at_xpath('/r/a2/text()').swap('jim')   # Text->text 
doc.at_xpath('/r/a3').swap('<x3 />')    # Element->element 
doc.at_xpath('/r/a4/text()').swap('<x4>jam</x4>') # Text->element 
doc.xpath('/r/text()').last.swap('jom')   # RootText->text 
puts doc.root 
#=> <r>x1<a2>jim</a2><x3/><a4><x4>jam</x4></a4>jom</r> 
#=> (correct output) 

frag = Nokogiri::XML::DocumentFragment.parse rooted 
frag.at_xpath('./r/a1').swap('x1')     # Element->text 
frag.at_xpath('./r/a2/text()').swap('jim')   # Text->text 
frag.at_xpath('./r/a3').swap('<x3 />')    # Element->element 
frag.at_xpath('./r/a4/text()').swap('<x4>jam</x4>') # Text->element 
frag.xpath('./r/text()').last.swap('jom')   # RootText->text 
puts frag 
#=> <r>x1<a2>jim</a2><x3/><a4><x4>jam</x4></a4>jom</r> 
#=> (correct output) 

frag = Nokogiri::XML::DocumentFragment.parse elems 
frag.at_xpath('./a1').swap('x1')     # Element->text 
frag.at_xpath('./a2/text()').swap('jim')   # Text->text 
frag.at_xpath('./a3').swap('<x3 />')    # Element->element 
frag.at_xpath('./a4/text()').swap('<x4>jam</x4>') # Text->element 
baz = frag.children.last 
begin 
    baz.swap('jom')         # RootText->text  
rescue Exception => e 
    p baz 
    #=> #<Nokogiri::XML::Text:0x80c66224 "baz"> 

    p e 
    #=> #<RuntimeError: error parsing fragment (1)> 

    puts e.backtrace 
    #=> /usr/local/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:509:in `in_context' 
    #=> /usr/local/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:509:in `parse' 
    #=> /usr/local/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/xml/document_fragment.rb:14:in `initialize' 
    #=> /usr/local/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:485:in `new' 
    #=> /usr/local/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:485:in `fragment' 
    #=> /usr/local/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:885:in `coerce' 
    #=> /usr/local/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:382:in `replace' 
    #=> /usr/local/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/xml/node.rb:407:in `swap' 
    #=> /Users/phrogz/Desktop/test_swap.rb:32:in `<main>'  
end  
puts frag 
#=> x1<a2>jim</a2><x3/><a4> 
#=> <x4>jam</x4> 
#=> </a4>baz 

編集2:これはでバグとして確認されているテキストがDocumentFragmentののルートではない場合、またはこのドキュメントではなく断片である場合は、正しく文字列を解析するように見えます鋸山開発チームは:

OMG! Thanks for the boog report!

I'm sure we don't have any test coverage that runs Node#replace and #swap on text nodes, so hopefully I'll be able to fix this for the 1.4.5 release.

+0

しかし、 "b"は "マークアップを含む文字列"です。私の編集を参照してください。 –

+0

@HoraceLoebまあ、私の編集を参照してください。引数を変更すると、それが機能します。 :)問題は、ドキュメントフラグメントがあるので、同じドキュメント内のマークアップからテキストノードを作成していないことです。あなたが正しいので、私は私の答えを編集します。 '' ''と交換しようとしても失敗するので、ここで問題となっているマークアップではありません。 – Phrogz

+0

匿名の回答者は、私の回答が質問された質問に答えることはできません。 – Phrogz

関連する問題