diff --git a/lib/oga/xml/node_set.rb b/lib/oga/xml/node_set.rb index 2b409d5..d50f193 100644 --- a/lib/oga/xml/node_set.rb +++ b/lib/oga/xml/node_set.rb @@ -166,9 +166,21 @@ module Oga # This method is intended to remove nodes from an XML document/node. # def remove + sets = [] + + # First we gather all the sets to remove nodse from, then we remove the + # actual nodes. This is done as you can not reliably remove elements + # from an Array while iterating on that same Array. @nodes.each do |node| - node.node_set.delete(node) - node.node_set = nil + if node.node_set + sets << node.node_set + + node.node_set = nil + end + end + + sets.each do |set| + @nodes.each { |node| set.delete(node) } end end diff --git a/spec/oga/xml/node_set_spec.rb b/spec/oga/xml/node_set_spec.rb index 6945bb9..14f6ab9 100644 --- a/spec/oga/xml/node_set_spec.rb +++ b/spec/oga/xml/node_set_spec.rb @@ -213,6 +213,12 @@ describe Oga::XML::NodeSet do @n1.node_set.nil?.should == true @n2.node_set.nil?.should == true end + + example 'remove all nodes from the owned set' do + @doc_set.remove + + @doc_set.empty?.should == true + end end context '#delete' do