From 37c39944a9109234bfdf7cfe75afc2808fd30e70 Mon Sep 17 00:00:00 2001 From: Dmitry Pogrebnoy Date: Wed, 30 Oct 2024 19:32:54 +0100 Subject: [PATCH] #214 Introduce `reset` option to PullParser --- lib/rexml/parsers/baseparser.rb | 4 ++++ lib/rexml/parsers/pullparser.rb | 4 ++++ test/test_pullparser.rb | 37 +++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb index ff72ce44..90851bb1 100644 --- a/lib/rexml/parsers/baseparser.rb +++ b/lib/rexml/parsers/baseparser.rb @@ -181,6 +181,10 @@ def add_listener( listener ) def stream=( source ) @source = SourceFactory.create_from( source ) + reset + end + + def reset @closed = nil @have_root = false @document_status = nil diff --git a/lib/rexml/parsers/pullparser.rb b/lib/rexml/parsers/pullparser.rb index a331eff5..e0b1e94d 100644 --- a/lib/rexml/parsers/pullparser.rb +++ b/lib/rexml/parsers/pullparser.rb @@ -93,6 +93,10 @@ def pull def unshift token @my_stack.unshift token end + + def reset + @parser.reset + end end # A parsing event. The contents of the event are accessed as an +Array?, diff --git a/test/test_pullparser.rb b/test/test_pullparser.rb index bdf8be17..39a67a41 100644 --- a/test/test_pullparser.rb +++ b/test/test_pullparser.rb @@ -156,6 +156,43 @@ def test_peek assert_equal( 0, names.length ) end + def test_reset + xml_chunks = [ + "First valid and complete message", + "Second valid and complete message", + "Third valid and complete message" + ] + + reader, writer = IO.pipe + xml_chunks.each do |chunk| + writer.write(chunk) + end + writer.close + + parser = REXML::Parsers::PullParser.new(reader) + messages = [] + while parser.has_next? + start_event = parser.pull + if start_event.start_element? and start_event[0] == 'message' + text = parser.pull + if text.text? + messages.push(text[0]) + end + end + end_event = parser.pull + if end_event.end_element? and end_event[0] == 'message' + parser.reset + end + end + + assert_equal( + messages, + ["First valid and complete message", + "Second valid and complete message", + "Third valid and complete message"] + ) + end + class EntityExpansionLimitTest < Test::Unit::TestCase class GeneralEntityTest < self def test_have_value