diff --git a/lib/oga/xml/generator.rb b/lib/oga/xml/generator.rb index d094e34..27d81bb 100644 --- a/lib/oga/xml/generator.rb +++ b/lib/oga/xml/generator.rb @@ -65,6 +65,13 @@ module Oga if child_node = children && current.children[0] current = child_node + elsif current == @start + # When we have reached the root node we should not process + # any of its siblings. If we did we'd include XML in the + # output from elements no part of the root node. + after_element(current, output) if current.is_a?(Element) + + break else until next_node = current.is_a?(Node) && current.next if current.is_a?(Node) && current != @start diff --git a/spec/oga/xml/generator_spec.rb b/spec/oga/xml/generator_spec.rb index 683daea..00d0a87 100644 --- a/spec/oga/xml/generator_spec.rb +++ b/spec/oga/xml/generator_spec.rb @@ -47,5 +47,36 @@ describe Oga::XML::Generator do output.should == '' end end + + describe 'using a Text node in a Document as the root node' do + it 'returns a String' do + text = Oga::XML::Text.new(text: "\n") + element = Oga::XML::Element.new(name: 'foo') + document = Oga::XML::Document.new(children: [text, element]) + + described_class.new(text).to_xml.should == "\n" + end + end + + describe 'using an Element in a Document as the root node' do + it 'returns a String' do + text = Oga::XML::Text.new(text: "\n") + element = Oga::XML::Element.new(name: 'foo') + document = Oga::XML::Document.new(children: [text, element]) + + described_class.new(element).to_xml.should == '' + end + end + + describe 'using an Element with a sibling as the root node' do + it 'returns a String' do + element1 = Oga::XML::Element.new(name: 'a') + element2 = Oga::XML::Element.new(name: 'b') + document = Oga::XML::Document.new(children: [element1, element2]) + + described_class.new(element1).to_xml.should == '' + described_class.new(element2).to_xml.should == '' + end + end end end