Skip to content

Commit

Permalink
fix sparklemotion#617: Nokogiri::XML::Reader#outer_xml is broken in J…
Browse files Browse the repository at this point in the history
…Ruby
  • Loading branch information
calavera committed Mar 29, 2012
1 parent 993d41b commit 9fd5914
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
10 changes: 8 additions & 2 deletions ext/java/nokogiri/XmlReader.java
Expand Up @@ -229,7 +229,10 @@ private String getInnerXml(ArrayDeque<ReaderNode> nodeQueue, ReaderNode current)
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
int currentDepth = (Integer)current.depth; int currentDepth = (Integer)current.depth;
for (ReaderNode node : nodeQueue) { for (ReaderNode node : nodeQueue) {
if (((Integer)node.depth) > currentDepth) sb.append(node.getString()); if (((Integer)node.depth) > currentDepth) {
sb.append(node.getString());
break;
}
} }
return new String(sb); return new String(sb);
} }
Expand All @@ -244,7 +247,10 @@ private String getOuterXml(ArrayDeque<ReaderNode> nodeQueue, ReaderNode current)
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
int initialDepth = (Integer)current.depth - 1; int initialDepth = (Integer)current.depth - 1;
for (ReaderNode node : nodeQueue) { for (ReaderNode node : nodeQueue) {
if (((Integer)node.depth) > initialDepth) sb.append(node.getString()); if (((Integer)node.depth) > initialDepth) {
sb.append(node.getString());
break;
}
} }
return new String(sb); return new String(sb);
} }
Expand Down
29 changes: 29 additions & 0 deletions test/test_reader.rb
Expand Up @@ -422,4 +422,33 @@ def test_large_document_smoke_test
end end
end end


def test_correct_outer_html_inclusion
xml = Nokogiri::XML::Reader.from_io(StringIO.new(<<-eoxml))
<root-element>
<children>
<child n="1">
<field>child-1</field>
</child>
<child n="1">
<field>child-2</field>
</child>
</children>
</root-element>
eoxml

nodelengths = []
has_child2 = []

xml.each do |node|
if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT and node.name == "child"
nodelengths << node.outer_xml.length
has_child2 << !!(node.outer_xml =~ /child-2/)
end
end

assert_equal(nodelengths[0], nodelengths[1])
assert(has_child2[1])
assert(!has_child2[0])
end

end end

0 comments on commit 9fd5914

Please sign in to comment.