diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb
index 87f50f09..44aacfa2 100644
--- a/lib/rexml/parsers/baseparser.rb
+++ b/lib/rexml/parsers/baseparser.rb
@@ -297,10 +297,11 @@ def pull_event
raise REXML::ParseException.new(message, @source)
end
name = parse_name(base_error_message)
- if @source.match?(/\s*\[/um, true)
+ @source.match?(/\s*/um, true) # skip spaces
+ if @source.match?("[", true)
id = [nil, nil, nil]
@document_status = :in_doctype
- elsif @source.match?(/\s*>/um, true)
+ elsif @source.match?(">", true)
id = [nil, nil, nil]
@document_status = :after_doctype
@source.ensure_buffer
@@ -312,9 +313,10 @@ def pull_event
# For backward compatibility
id[1], id[2] = id[2], nil
end
- if @source.match?(/\s*\[/um, true)
+ @source.match?(/\s*/um, true) # skip spaces
+ if @source.match?("[", true)
@document_status = :in_doctype
- elsif @source.match?(/\s*>/um, true)
+ elsif @source.match?(">", true)
@document_status = :after_doctype
@source.ensure_buffer
else
@@ -409,7 +411,8 @@ def pull_event
id = parse_id(base_error_message,
accept_external_id: true,
accept_public_id: true)
- unless @source.match?(/\s*>/um, true)
+ @source.match?(/\s*/um, true) # skip spaces
+ unless @source.match?(">", true)
message = "#{base_error_message}: garbage before end >"
raise REXML::ParseException.new(message, @source)
end
diff --git a/test/parse/test_document_type_declaration.rb b/test/parse/test_document_type_declaration.rb
index 99c23745..b22863a9 100644
--- a/test/parse/test_document_type_declaration.rb
+++ b/test/parse/test_document_type_declaration.rb
@@ -153,7 +153,7 @@ def test_no_literal
Line: 3
Position: 26
Last 80 unconsumed characters:
- SYSTEM>
+SYSTEM>
DETAIL
end
@@ -200,7 +200,7 @@ def test_content_double_quote
Line: 3
Position: 62
Last 80 unconsumed characters:
- PUBLIC 'double quote " is invalid' "r.dtd">
+PUBLIC 'double quote " is invalid' "r.dtd">
DETAIL
end
@@ -228,10 +228,10 @@ def test_garbage_after_literal
end
assert_equal(<<-DETAIL.chomp, exception.to_s)
Malformed DOCTYPE: garbage after external ID
-Line: 3
-Position: 65
+Line: 1
+Position: 58
Last 80 unconsumed characters:
-x'>
+x'>
DETAIL
end