diff --git a/lib/nokogiri/xml/node.rb b/lib/nokogiri/xml/node.rb index aa112a81fdb..bdaae38ebea 100644 --- a/lib/nokogiri/xml/node.rb +++ b/lib/nokogiri/xml/node.rb @@ -376,17 +376,22 @@ def children= node_or_tags # # Also see related method +swap+. def replace node_or_tags + # We cannot replace a text node directly, otherwise libxml will return + # an internal error at parser.c:13031, I don't know exactly why + # libxml is trying to find a parent node that is an element or document + # so I can't tell if this is bug in libxml or not. issue #775. + if text? + replacee = Nokogiri::XML::Node.new 'dummy', document + add_previous_sibling_node replacee + unlink + return replacee.replace node_or_tags + end + node_or_tags = coerce(node_or_tags) + if node_or_tags.is_a?(XML::NodeSet) - if text? - replacee = Nokogiri::XML::Node.new 'dummy', document - add_previous_sibling_node replacee - unlink - else - replacee = self - end - node_or_tags.each { |n| replacee.add_previous_sibling n } - replacee.unlink + node_or_tags.each { |n| add_previous_sibling n } + unlink else replace_node node_or_tags end diff --git a/test/xml/test_document_fragment.rb b/test/xml/test_document_fragment.rb index b72c8796981..7164e6cecd6 100644 --- a/test/xml/test_document_fragment.rb +++ b/test/xml/test_document_fragment.rb @@ -8,6 +8,13 @@ def setup @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE) end + def test_replace_text_node + html = "foo" + doc = Nokogiri::XML::DocumentFragment.parse(html) + doc.children[0].replace "bar" + assert_equal 'bar', doc.children[0].content + end + def test_fragment_is_relative doc = Nokogiri::XML('') ctx = doc.root.child