С Hpricot вы можете сделать это:
> doc = Hpricot("a")
=> #<Hpricot::Doc "a">
> doc.children.first.swap('b')
=> ["b"]
> doc.to_s
=> "b"
Но если вы попробуете то же самое с Nokogiri, вы получите ошибку:
> 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
Как я могу использовать swap
на текстовых узлах в Nokogiri?
Редактировать: Обратите внимание, что это не проблема с ARGUMENT для 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"